Hướng dẫn php ffi rust

Giới thiệu

Được đề xuất từ RFC: PHP RFC: FFI - Foreign Function Interface, PHP FFI đã chính thức được chấp nhận và trở thành một extension của PHP từ phiên bản PHP 7.4.

FFI cho phép bạn sử dụng các thư viện shared library [các file .so hay .dll] từ các ngôn khác như C, Go, Rust,... trực tiếp bằng PHP code mà không phải viết PHP extension bằng ngôn ngữ C.

Các shared library thường được viết bằng C. Nhưng nó có thể viết bằng nhiều ngôn ngữ khác mà có khả năng biên dịch như: C++, Rust, Go,.... Trên Linux, thư viện được compile thành các .so file. Trên Windows nó là .dll file.

Thông thường các PHP extension được viết bằng ngôn ngữ C, chẳng hạn PHP PDO, GD, Imagick, Bcmath... và các extensions phải cài đặt như một package của hệ thống chứ không thể cài trực tiếp bằng composer.

PHP FFI còn đang được phát triển và có tiềm năng ứng dụng cao, một vài ví dụ:

  • Prototype nhanh các thư viện mà chưa có PHP extension chẳng hạn Tensorflow, Redis client, các thư viện liên quan đến ML, thư viện bản quyền,...
  • Tích hợp các thư viện dễ hơn mà không cần expert về ngôn ngữ C
  • Implement các tác vụ yêu cầu độ tải cao bằng C, Rust sau đó tích hợp vào PHP
  • PHP Engine Direct API
  • Immutable object library for PHP
  • //github.com/gabrielrcouto/awesome-php-ffi

Python trở thành ngôn ngữ phổ biến nhất cho Machine Learning cũng nhờ có FFI do có khả năng dễ dàng tích hợp với các thư việc C. //dev.to/verkkokauppacom/introduction-to-php-ffi-po3

Thử dùng PHP FFI

Để sử dụng PHP FFI, cách đơn giản là sử dụng docker PHP 7.4:

docker run --name php74 -it php:7.4 bash

Sau đó chạy các lệnh để cài đặt FFI extension:

apt-get update && apt-get install libffi-dev && docker-php-ext-configure ffi --with-ffi && docker-php-ext-install ffi

Kiểm tra lại xem FFI extension đã được load chưa bằng lệnh:

php -m

=> Output:

[PHP Modules]
Core
...
FFI
...

[Zend Modules]
...

Theo mặc định FFI được enable trong các trường hợp sau:

  1. Chạy PHP script bằng PHP CLI, ví dụ php test-ffi.php
  2. Sử dụng tính năng preload của PHP 7.4 khi chạy web app => tham khảo bài biết về preload

Tuy nhiên có thể thiết lập lại thông qua giá trị ffi.enable trong php.ini:

; FFI API restriction. Possible values:
; "preload" - enabled in CLI scripts and preloaded files [default]
; "false"   - always disabled
; "true"    - always enabled
ffi.enable=preload

Ví dụ

Load thư viện có sẵn

Ví dụ đơn giản đầu tiên đó là load thư viện libc và export function printf[] để sử dụng trong PHP:

Chủ Đề