站長資訊網
        最全最豐富的資訊網站

        面試官:列舉幾種PHP拓展的實現手段及其性能比較?

        關于 PHP 擴展的幾種實現手段

        1.php 原生擴展開發 c 語言,注:【ext_skel.php】腳本創建

        2.zephir

        3.php-cpp

        4.php-x

        5.cgo

        • 封裝 zendapi 模式

        • CGO 嵌套 C 和 GO 代碼,用 GO 去編譯了 php 擴展骨架和 GO 的具體實現

        等。。。不限上面幾種方式。

        圍繞【zephir,cgo,PHP 開啟 JIT】4 種模式下,通過斐波那契數列計算性能,來查看運行效果。

        zephir 代碼生成擴展

        //Main 類 final class Zimuge {   public static function calcFibonacci(int i){       if (i < 2) {           return i;       }       return self::calcFibonacci(i - 1) + self::calcFibonacci(i - 2);   }
        編譯安裝 zephir build

        cgo 代碼生成擴展

        package main /* #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" static int le_go2php; PHP_MINIT_FUNCTION(go2php) {     return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(go2php) {     return SUCCESS; } PHP_RINIT_FUNCTION(go2php) {     return SUCCESS; } PHP_RSHUTDOWN_FUNCTION(go2php) {     return SUCCESS; } PHP_MINFO_FUNCTION(go2php) {     php_info_print_table_start();     php_info_print_table_header(2, "go2php support", "enabled");     php_info_print_table_end(); } PHP_FUNCTION(go2php_print) {     zend_long a,b;     ZEND_PARSE_PARAMETERS_START(1, 1)         Z_PARAM_LONG(a)     ZEND_PARSE_PARAMETERS_END();     b = calcFib(a);     RETURN_LONG(b); } ZEND_BEGIN_ARG_INFO(null, 0) ZEND_END_ARG_INFO() const zend_function_entry go2php_functions[] = {     PHP_FE(go2php_print, null)     PHP_FE_END }; zend_module_entry go2php_module_entry = {     STANDARD_MODULE_HEADER,     "go2php",     go2php_functions,     PHP_MINIT(go2php),     PHP_MSHUTDOWN(go2php),     PHP_RINIT(go2php),     PHP_RSHUTDOWN(go2php),     PHP_MINFO(go2php),     "0.1.0",     STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_GO2PHP ZEND_GET_MODULE(go2php) #endif */ import "C" func main() {}
        package main import "C" //export calcFib func calcFib(i int) int {     if i < 2 {         return i     }     return calcFib(i-1)+calcFib(i-2) }

        編譯&鏈接

        CGO_CFLAGS="-g  -I`/root/download/php8/bin/php-config --include-dir`  -I`/root/download/php8/bin/php-config --include-dir`/main  -I`/root/download/php8/bin/php-config --include-dir`/TSRM  -I`/root/download/php8/bin/php-config --include-dir`/Zend  -I`/root/download/php8/bin/php-config --include-dir`/ext  -I`/root/download/php8/bin/php-config --include-dir`/ext/date/lib  -DHAVE_CONFIG_H" CGO_LDFLAGS="-Wl,--export-dynamic -Wl,--unresolved-symbols=ignore-all" go build -p 1 -gcflags "-l" -buildmode=c-shared -o go2php.so

        測試用 php 腳本代碼

        <?php const COUNT = 30; function calcFibonacci(int $i): int {     if ($i < 2) {         return $i;     }     return calcFibonacci($i - 1) + calcFibonacci($i - 2); } // CGO 速度 $startTime = microtime(true); for($i = 1; $i <= COUNT; $i++) {     if($i != COUNT) {         go2php_print($i);     }else {         echo go2php_print($i)."n";     } } $time = microtime(true) - $startTime; echo "CGO: {$time} 秒n"; //zephir 速度 $startTime = microtime(true); for($i = 1; $i <= COUNT; $i++) {     if($i != COUNT) {         LszZimuge::calcFibonacci($i);     }else {         echo LszZimuge::calcFibonacci($i)."n";     } } $time = microtime(true) - $startTime; echo "zephir: {$time} 秒n"; // PHP JIT 速度 $startTime = microtime(true); for($i = 1; $i <= COUNT; $i++) {     if($i != COUNT) {         calcFibonacci($i);     }else {         echo calcFibonacci($i)."n";     } } $time = microtime(true) - $startTime; echo "PHP: {$time} 秒n";

        不使用 PHP JIT 的情況下測試

        php test.php ->執行結果取一個平均 832040 CGO: 0.059875011444092 秒 832040 zephir: 8.5679790973663 秒 832040 PHP: 0.75995492935181 秒

        使用 PHP JIT 的情況下測試

        php -dopcache.enable_cli=1 -dopcache.jit_buffer_size=100M test.php  ->執行結果取一個平均 832040 CGO: 0.046900987625122 秒 832040 zephir: 5.5882248878479 秒 832040 PHP: 0.10621190071106 秒

        cgo 和 zephir 編譯后的 so文件,通過php.ini 引入進來

        執行測試腳本需要保證so正確讀取進來。

        命令 php -m 或者 php –ri xx.so 進行確認。

        [PHP Modules] Core ctype curl date dom FFI fileinfo filter gd go2php hash iconv json libxml lsz mbstring mysqlnd openssl pcre PDO pdo_mysql pdo_sqlite Phar posix redis Reflection session SimpleXML SPL sqlite3 standard swoole tokenizer xml xmlreader xmlwriter yaf Zend OPcache zephir_parser zimuge [Zend Modules] Zend OPcache

        使用PHP版本

        php -v PHP 8.1.3 (cli) (built: Feb 27 2022 19:40:08) (NTS) Copyright (c) The PHP Group Zend Engine v4.1.3, Copyright (c) Zend Technologies     with Zend OPcache v8.1.3, Copyright (c), by Zend Technologies

        結論:

        JIT 能提高 php 的性能。

        想學習 go 又不想放棄 php 可以用玩下 CGO。

        zephir 雖然計算性能不太好,但是寫 PHP 擴展實現起來比較簡單。

        推薦學習:《PHP視頻教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产精品www| 91精品国产人成网站| 欧洲精品视频在线观看| 亚洲欧美精品AAAAAA片| 国产成人精品高清不卡在线| 2021久久国自产拍精品| 亚洲处破女AV日韩精品| 精品国产亚洲男女在线线电影| 欧美国产日韩精品| 91久久精品91久久性色| 人妻少妇偷人精品无码| 亚洲午夜成人精品电影在线观看| 精品无码久久久久久国产| 99久久精品国产毛片| 精品精品国产自在久久高清| 国产精品无码成人午夜电影| 久久久免费精品re6| 亚洲欧洲成人精品香蕉网| 日韩熟女精品一区二区三区| 精品国产免费人成网站| 国产免费久久精品99久久| 国产精品女人呻吟在线观看| 亚洲精品国产精品乱码视色| 国产精品美女网站| 91嫩草亚洲精品| 国产精品V亚洲精品V日韩精品| 2021国产成人精品久久| 国产成人精品一区在线| 911亚洲精品国产自产| 真实国产乱子伦精品免费| 日韩精品免费视频| 热99re久久国超精品首页| 亚洲国产精品久久久久久| 精品午夜久久福利大片| 久久精品国产亚洲沈樵| 亚洲精品免费在线观看| 99久久精品国产一区二区三区| 777国产盗摄偷窥精品0OOO| 国产va免费精品| 国产线视频精品免费观看视频| 久久99精品九九九久久婷婷|