本篇文章更新時間:2022/02/19
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
先前筆記過 [PHP] 快速開發 PHP extension 延伸外掛模組工具框架: PHP-CPP 介紹如何包裝 PHP 延伸外掛模組。
今天看到 PHP 7.4
版本後加入了 FFI(Foreign Function Interface)的延伸外掛模組,可以讓呼叫外部方法更直覺一點,不需要寫過一個完整的 extension 外掛模組。
PHP 7.4 後才有 FFI 模組,所以必須注意 PHP 版本
這範例是用 GO 來寫方法,編譯成 C shared library
package main
import (
"C"
"fmt"
)
func main(){
}
//export print
func print(out *C.char) {
fmt.Println("[GO print] " + C.GoString(out))
}
//export sum
func sum(a C.int, b C.int) C.int {
return a + b
}
存擋為 util.go
後,下指令 go build -o libutil.so -buildmode=c-shared util.go
編譯,會出現 libutil.h
與 libutil.so
兩個檔案。
然後開一個 test.php
檔案,內容如下:
print(
(string) $util->sum(2, 4)
);
執行 php -f test.php
就會發現呼叫了 Go 裡的兩個方法。
相關的 FFI 延伸應用可以搜尋 GitHub,可以發現有不少了!
後記
我用 Mac 上的 MAMP 來測試,預設沒有包含 FFI 模組,所以要自己編譯。
curl -O https://www.php.net/distributions/php-7.4.12.tar.gz
tar -zxvf php-7.4.12.tar.gz
cd php-7.4.12/ext/ffi
phpize
./configure --with-php-config=/Applications/MAMP/bin/php/php7.4.12/bin/php-config
make
掛載上還要編輯一下 php.ini
檔案,補上:
[ffi]
ffi.enable=true
extension="/Applications/MAMP/bin/php/php7.4.12/lib/php/extensions/no-debug-non-zts-20190902/ffi.so"
有這 FFI 支援後,其實可以想見日後複雜且對精度有特別要求的運算都能這樣「外包」出去,運算速度不差,超讚啊~