站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        讓PHP能夠調(diào)用C的函數(shù):FFI擴(kuò)展(附代碼)

        本篇文章給大家介紹一下能夠讓PHP能夠調(diào)用C的函數(shù):FFI擴(kuò)展。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對大家有所幫助。

        讓PHP能夠調(diào)用C的函數(shù):FFI擴(kuò)展(附代碼)

        讓PHP能夠調(diào)用C的函數(shù)-FFI擴(kuò)展

        在大型公司中,一般會有很我編程語言的配合。比如說讓 Java 來做微服務(wù)層,用 C++ 來進(jìn)行底層運(yùn)算,用 PHP 來做中間層,最后使用 JS 展現(xiàn)效果。這些語言間的配合大部分都是通過 RPC 來完成,或者直接將數(shù)據(jù)入庫再使用不同的語言來取用。那么,我們 PHP 的代碼能否直接調(diào)用這些語言呢?其實(shí),PHP 還真為我們準(zhǔn)備了一個(gè)可以直接調(diào)用 C 語言的擴(kuò)展庫,并且這個(gè)擴(kuò)展庫還是已經(jīng)默認(rèn)內(nèi)置在 PHP 中了,它就是 FFI 擴(kuò)展。

        什么是 FFI

        FFI , Foreign Function Interface,外部函數(shù)接口。這個(gè)擴(kuò)展允許我們加載一些公共庫(.dll、.so),其實(shí)也就是可以調(diào)用一些 C 的數(shù)據(jù)結(jié)構(gòu)及函數(shù)。它已經(jīng)是隨 PHP 源碼發(fā)布的一個(gè)擴(kuò)展了,在編譯的時(shí)候可以加上 –with-ffi 來直接編譯到 PHP 程序中。

        我們這里已經(jīng)是編譯好的 PHP ,所以我們直接找到這個(gè)擴(kuò)展,進(jìn)行簡單的擴(kuò)展安裝步驟就可以安裝完成。

        cd php-7.4.4/ext/ffi/ phpize ./configure make && make install

        安裝完成后記得在 php.ini 文件中打開擴(kuò)展。關(guān)于這個(gè)擴(kuò)展需要注意的一點(diǎn)是,它有一個(gè)配置項(xiàng)為 ffi.enable ,默認(rèn)情況下這個(gè)配置項(xiàng)的值是 "preload" ,僅在 CLI SAPI 環(huán)境下啟用 FFI 的能力。當(dāng)然,我們也可以修改為 "true" 或 "false" 來開啟和關(guān)閉它。設(shè)定為 "true" 將使得這個(gè)擴(kuò)展在任何環(huán)境下都啟用。

        使用 FFI 調(diào)用 C 的函數(shù)

        接下來,簡單地看一下它是如何調(diào)用 C 的函數(shù)的。

        // 創(chuàng)建一個(gè) FFI 對象,加載 libc 并且導(dǎo)入 printf 函數(shù) $ffi_printf = FFI::cdef(     "int printf(const char *format, ...);", // C 的定義規(guī)則     "libc.so.6"); // 指定 libc 庫 // 調(diào)用 C 的 printf 函數(shù) $ffi_printf->printf("Hello %s!n", "world"); // Hello World  // 加載 math 并且導(dǎo)入 pow 函數(shù) $ffi_pow = FFI::cdef(     "double pow(double x, double y);",      "libboost_math_c99.so.1.66.0"); // 這里調(diào)用的是 C 的 pow 函數(shù),不是 PHP 自己的 echo $ffi_pow->pow(2,3), PHP_EOL; // 8

        我們創(chuàng)建了兩個(gè)對象,分別調(diào)用了 C 的 printf() 和 pow() 函數(shù)。FFI::cdef() 是用于創(chuàng)建一個(gè) FFI 對象,它接收兩個(gè)參數(shù),一個(gè)是包含常規(guī)C語言(類型、結(jié)構(gòu)、函數(shù)、變量等)聲明序列的字符串。實(shí)際上,這個(gè)字符串可以從C頭文件復(fù)制粘貼。而另一個(gè)參數(shù)則是要加載并定義鏈接的共享庫文件的名稱。也就是我們需要的 .dll 或 .so 文件,它與我們聲明字符串是對應(yīng)的,比如在 libc.so.6 中并沒有 pow() 這類的計(jì)算函數(shù),所以我們就要找到 math 相關(guān)的 C 語言計(jì)算函數(shù)庫。

        定義變量和數(shù)組

        當(dāng)然,F(xiàn)FI 也是可以定義變量和數(shù)組的。

        // 創(chuàng)建一個(gè) int 變量 $x = FFI::new("int"); var_dump($x->cdata); // int(0)  // 為變量賦值 $x->cdata = 5; var_dump($x->cdata); // int(5)  // 計(jì)算變量 $x->cdata += 2; var_dump($x->cdata); // int(7)   // 結(jié)合上面的兩個(gè) FFI 對象操作  echo "pow value:", $ffi_pow->pow($x->cdata, 3), PHP_EOL; // pow value:343 $ffi_printf->printf("Int Pow value is : %fn", $ffi_pow->pow($x->cdata, 3)); // Int Pow value is : 343.000000   // 創(chuàng)建一個(gè)數(shù)組 $a = FFI::new("long[1024]"); // 為數(shù)組賦值 for ($i = 0; $i < count($a); $i++) {     $a[$i] = $i; } var_dump($a[25]); // int(25)  $sum = 0; foreach ($a as $n) {     $sum += $n; } var_dump($sum); // int(523776)  var_dump(count($a)); // int(1024) 數(shù)組長度 var_dump(FFI::sizeof($a)); // int(8192),內(nèi)存大小

        使用 FFI::new() 函數(shù)來創(chuàng)建一個(gè) C 的數(shù)據(jù)結(jié)構(gòu),也就是變量聲明,這些變量的內(nèi)容將保存在 cdata 屬性中。而數(shù)組則直接就可以操作這個(gè)函數(shù)的返回值。當(dāng)然,當(dāng)我們要結(jié)束使用的時(shí)候,還是需要使用 FFI::free() 來釋放變量的,就和 C 語言的開發(fā)一樣。

        總結(jié)

        是不是感覺很高大上?但是請注意哦,F(xiàn)FI 調(diào)用的 C 函數(shù)并沒有 PHP 本身去調(diào)用的效率高。比如這種 pow() 函數(shù),使用 PHP 自身的效率更好。而且,F(xiàn)FI 擴(kuò)展雖說已經(jīng)是跟隨 PHP 同步發(fā)布的擴(kuò)展,但它還是處于實(shí)驗(yàn)性質(zhì)的。也就是說,這個(gè)擴(kuò)展是為未來可能用到的其它功能準(zhǔn)備的,而且還有很多不確定性。所以在生產(chǎn)環(huán)境中如果需要合適類似的功能的話,那么還是要做

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 国产精品福利片免费看 | 国产精品对白刺激久久久| 国产成人精品综合久久久| 精品亚洲成AV人在线观看| 四虎国产精品永久在线看| 国产高清在线精品一本大道| 国产精品99精品无码视亚| 亚洲精品国产V片在线观看| 精品人妻一区二区三区毛片| 亚洲国产精品欧美日韩一区二区| 精品久久久久久无码专区不卡| 亚洲精品成人区在线观看| 久久99亚洲综合精品首页| 91麻豆精品一二三区在线| 久久91精品国产91久久小草| 精品偷自拍另类在线观看| 亚洲精品岛国片在线观看| 日韩欧美亚洲国产精品字幕久久久| 国产精品女同一区二区久久| 91精品国产麻豆国产自产在线| 免费精品99久久国产综合精品| 国产精品视频免费| 国产精品1区2区3区在线播放| 久久精品国产亚洲av麻豆小说| 日本VA欧美VA欧美VA精品| 亚洲AV无码久久精品蜜桃| 香蕉久久夜色精品升级完成| 亚洲精品国产精品乱码不卡√| 无码人妻精品一区二区在线视频 | 精品一区二区久久久久久久网站| 国产成人vr精品a视频| 国产精品无码一区二区三级| 国产麻豆一精品一AV一免费| 国产成人精品AA毛片| 2021久久国自产拍精品| 国产精品免费无遮挡无码永久视频 | 在线亚洲精品自拍| 日韩精品无码永久免费网站| 久久93精品国产91久久综合| 国内精品久久久久久中文字幕| 精品国产呦系列在线观看免费|