本篇文章更新時間:2022/02/19
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知或向一介資男的 LINE 社群反應。
如果本站內容對你有幫助,歡迎贊助支持


先前筆記過 [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.hlibutil.so 兩個檔案。

然後開一個 test.php 檔案,內容如下:

<?php
$util = FFI::cdef(
    "void print(char* p0);
    int sum(int p0, int p1);",
    __DIR__ . "/libutil.so"
);
$util->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 支援後,其實可以想見日後複雜且對精度有特別要求的運算都能這樣「外包」出去,運算速度不差,超讚啊~


Share:

作者: Chun

WordPress 社群貢獻者、開源社群推廣者。專注於 WordPress 外掛開發、網站效能最佳化、伺服器管理,以及 iDempiere 開源 ERP 導入與客製開發。曾參與 WordCamp Taipei 等社群活動,GitHub Arctic Code Vault Contributor。提供資訊顧問、WordPress 開發教學、主機最佳化與企業 ERP 整合服務。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon