新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
面試官:列舉幾種PHP拓展的實現(xiàn)手段及其性能比較?
關(guān)于 php 擴展的幾種實現(xiàn)手段

1.php 原生擴展開發(fā) c 語言,注:【ext_skel.php】腳本創(chuàng)建
2.zephir
3.php-cpp
4.php-x
5.cgo
-
封裝 zendapi 模式
-
CGO 嵌套 C 和 GO 代碼,用 GO 去編譯了 php 擴展骨架和 GO 的具體實現(xiàn)
等。。。不限上面幾種方式。
圍繞【zephir,cgo,PHP 開啟 JIT】4 種模式下,通過斐波那契數(shù)列計算性能,來查看運行效果。
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 JIT 的情況下測試
php test.php ->執(zhí)行結(jié)果取一個平均 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 ->執(zhí)行結(jié)果取一個平均 832040 CGO: 0.046900987625122 秒 832040 zephir: 5.5882248878479 秒 832040 PHP: 0.10621190071106 秒cgo 和 zephir 編譯后的 so文件,通過php.ini 引入進來
執(zhí)行測試腳本需要保證so正確讀取進來。
命令 php -m 或者 php --ri xx.so 進行確認(rèn)。
[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結(jié)論:
JIT 能提高 php 的性能。
想學(xué)習(xí) go 又不想放棄 php 可以用玩下 CGO。
zephir 雖然計算性能不太好,但是寫 PHP 擴展實現(xiàn)起來比較簡單。
網(wǎng)站欄目:面試官:列舉幾種PHP拓展的實現(xiàn)手段及其性能比較?
文章鏈接:http://www.dlmjj.cn/article/dpjsgci.html


咨詢
建站咨詢
