PHP 7.4 的FFI 將支持更好地在PHP 中使用C 函數/數據結構
即將在下月底發布的PHP 7.4將會引入一個有趣的新功能,那就是期待已久的對FFI(外部函數接口,Foreign Function Interface)的支持。此功能使得開發者可以在原生PHP代碼中調用C定義的函數/變量/數據結構。
FFI與預加載功能都將是PHP 7.4的重要新功能,FFI還增強了PHP FPM systemd服務、用於OpenSSL流的TLS 1.3以及許多其他更改。PHP 7.4的FFI甚至可與其他語言的FFI實現相媲美。
使用PHP FFI應該可以減少為C庫/程序接口編寫新PHP模塊的需求,因為現在可以使用外部函數接口來完成了。如果你對PHP 7.4 FFI的示例代碼感到好奇,負責Fedora/RedHat的PHP打包程序工程師Remi Collet撰寫了一篇新的博客文章,其中概述了一些帶有示例代碼的用例。
下面摘錄一個簡單的例子:
Redis 客戶端
目前存在使用C或PHP編寫的 Redis客戶端的各種實現,此示例演示了使用FFI來訪問 hiredis 庫的函數。
1.定義庫,從庫的頭文件 hiredis/hredis.h 和 hiredis/read.h 複製/粘貼:preload-redis.h
2.對需要預加載的RemiRedis 類進行定義:preload-redis.inc
3.使用此類的測試腳本:redis.php
輸出摘要
$ php74 -d ffi.preload=preload-redis.h -d opcache.preload=preload-redis.inc redis.php... + RemiRedis::__construct(localhost, 6379) + RemiRedis::initFFI() + RemiRedis::del(foo)int(1) + RemiRedis::get(foo)NULL + RemiRedis::set(foo, 2019/10/23 12:45:03)string(2) "OK" + RemiRedis::get(foo) string(19) "2019/10/23 12:45:03" + RemiRedis::__destruct
如果希望了解有關PHP 7.4 FFI的更多信息,可以查看 PHP.net 上的文檔及其基本示例。在發布PHP 7.4 GA前估計會經歷多個RC版本,GA預計將在11月28日左右發布。