Giới thiệu
Từ phiên bản 7.4 của PHP, chúng ta cuối cùng cũng có quyền truy cập vào các chức năng tương tác giữa các ngôn ngữ khác nhau và PHP: FFI hay Giao diện Chức năng Ngoại vi.
FFI là gì?
Đơn giản là khả năng sử dụng thư viện bên ngoài (.dll hoặc .so) trực tiếp trong PHP, mà không cần tạo ra một extension PHP.
Vâng, chỉ với một script PHP!
Đó là, trong số những thứ khác, điều đã làm cho Python trở nên nổi tiếng và cho phép nó có nhiều tính năng hơn.
Điều tuyệt vời về FFI là một nhà phát triển PHP không phải là chuyên gia trong C/Rust/Go/Kotlin (danh sách không giới hạn) cuối cùng cũng có thể tự liên kết một thư viện bên ngoài. Vì vậy, nếu bạn có một dự án với nhu cầu cụ thể, một thư viện độc quyền, hoặc bất cứ điều gì, và bạn không quá tải, bạn có thể trực tiếp thực hiện việc phát triển sử dụng nó.
Nó hiếm khi xảy ra, nhưng tại partITech, chúng tôi đã phải phát triển các module PHP. Kết quả là, việc phát triển kết nối với thư viện trong PHP sẽ làm cho quy trình trở nên đơn giản và nhanh chóng triển khai hơn.
Tất nhiên, tính năng này đi kèm với một cái giá bởi vì, mặc dù quy trình cho phép phát triển nhanh hơn, nhưng nó không nhanh bằng một module PHP thực sự được viết bằng C/C++.
Thực tế, việc truy cập các cấu trúc với FFI hiện tại chậm gấp đôi so với module gốc. Do đó, không khuyến nghị sử dụng FFI để cải thiện hiệu suất ứng dụng của bạn. Tuy nhiên, nó có thể giúp bạn giảm bớt việc sử dụng bộ nhớ trong các quy trình đòi hỏi cao. (nguồn https://www.php.net/manual/en/intro.ffi.php).
Được rồi, đủ với những lời giới thiệu và nói chuyện phiếm. Điều chúng ta muốn thấy là mã.
Vì vậy, tôi đề xuất chúng ta hãy xem xét một số vấn đề gặp phải trong quá trình thử nghiệm của chúng tôi. Tất nhiên, mỗi dự án là khác nhau, nhưng nếu bài viết này có thể giúp bạn "vọc" với "ruột" của nó, chúng tôi sẽ rất vui.
Hello World
Bài kiểm tra chuẩn cơ bản vẫn là "Hello World" nổi tiếng, vì vậy hãy bắt đầu hành trình của chúng ta vào thế giới tuyệt vời của FFI với một chức năng C sẽ trả về "Hello World" cho chúng ta.
hello.c
#include <stdio.h>
const char * hello() {
return "Hello, World!";
}
hello.h
export const char * hello();
Bây giờ chúng ta có thể biên dịch.
gcc -c hello.c
Chúng tôi yêu cầu gcc tạo thư viện chia sẻ của chúng tôi, tệp .so nổi tiếng.
gcc -shared -o hello.so hello.o
Đó là nó! Bây giờ chúng tôi đã có vật liệu để chơi trực tiếp với PHP-ffi.
Đây là mã PHP cho phép chúng tôi gọi chức năng hello() của mình.
hello.php
#!/usr/bin/php8.1
<?php
$ffi = FFI::cdef(
"const char *hello();",
__DIR__ ."/hello.so"
);
echo $ffi->hello();
chmod +x hello.php
./hello.php
Hello, World!
Giải thích:
Phương thức cdef cho phép chúng ta tạo một đối tượng FFI mới. Tham số đầu tiên là một chuỗi chứa định nghĩa của thư viện của chúng ta. Chúng tôi không cần phải đặt tất cả thông tin của thư viện, chỉ cần những gì quan tâm đến chúng tôi.
Lưu ý rằng nếu bạn sử dụng các tệp định nghĩa phức tạp, có khả năng nó sẽ gặp sự cố ngay lập tức. Từ những gì tôi đã sử dụng, tôi đã tái tạo và đơn giản hóa các tệp định nghĩa một cách có hệ thống.
Chúng ta sẽ thấy trong một ví dụ khác cách tạo và sử dụng trực tiếp một tệp đầu tiên quá lớn để đặt trực tiếp trong script của chúng ta. Nó có thể nhanh chóng trở nên phức tạp 😊
Tham số thứ hai là thư viện chia sẻ của chúng ta. Không cần giải thích thật sự.
Cuối cùng, chúng ta sẽ trực tiếp gọi chức năng và hiển thị kết quả.
Đơn giản... Cơ bản.
Chúng ta có nên chuyển sang một ví dụ nâng cao hơn không? Hẹn gặp bạn trong phần thứ hai của hồ sơ về thế giới tuyệt vời của Giao diện Chức năng Ngoại vi.
PHP FFI: Truyền tham số và sử dụng động cơ zend - phần 2
Cảm ơn Thomas Bourdin, Cédric Le Jallé, và Stéphane Pechard vì sự giúp đỡ, lời khuyên, và biên tập của họ.