[PHP] Foreign Function Interface, FFI 模組搭配使用 Golang

本篇文章更新時間: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.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

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____34%_________]

發佈留言

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

文章
Filter

Filter Search Results