• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 面试官:列举几种PHP拓展的实现手段及其性能比较?

面试官:列举几种PHP拓展的实现手段及其性能比较?

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了PHP拓展的实现手段,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_GO2PHPZEND_GET_MODULE(go2php)#endif*/import "C"func main() {}
package mainimport "C"//export calcFibfunc 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 脚本代码

<?phpconst 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) {        Lsz\Zimuge::calcFibonacci($i);    }else {        echo Lsz\Zimuge::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->执行结果取一个平均832040CGO: 0.059875011444092 秒832040zephir: 8.5679790973663 秒832040PHP: 0.75995492935181 秒

使用 PHP JIT 的情况下测试

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

cgo 和 zephir 编译后的 so文件,通过php.ini 引入进来

执行测试脚本需要保证so正确读取进来。

命令 php -m 或者 php --ri xx.so 进行确认。

[PHP Modules]CorectypecurldatedomFFIfileinfofiltergdgo2phphashiconvjsonlibxmllszmbstringmysqlndopensslpcrePDOpdo_mysqlpdo_sqlitePharposixredisReflectionsessionSimpleXMLSPLsqlite3standardswooletokenizerxmlxmlreaderxmlwriteryafZend OPcachezephir_parserzimuge[Zend Modules]Zend OPcache

使用PHP版本

php -vPHP 8.1.3 (cli) (built: Feb 27 2022 19:40:08) (NTS)Copyright (c) The PHP GroupZend 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 扩展实现起来比较简单。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 面试官:列举几种PHP拓展的实现手段及其性能比较?

相关文章

  • 2022-04-29Phpcms V9管理后台登陆及会员注册登录模板的修改
  • 2022-04-29如何安装和使用BootstrapVue,构建项目界面
  • 2022-04-29dedecms页面获取会员状态的代码
  • 2022-04-29uni-app介绍全局样式引入和底部导航栏开发
  • 2022-04-29Photoshop绘制一个复古的游戏手柄
  • 2022-04-29Illustrator绘制水晶质感苹果标志
  • 2022-04-29php base64如何进行URL字符串编码和解码?
  • 2022-04-29JavaScript中如何判断函数、变量是否存在
  • 2022-04-29Photoshop制作燃烧效果的岩石字
  • 2022-04-29用Coreldraw做漂亮的动画图片

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • nginx隐藏index.php的设置方法
    • WordPress主题给文章增加百度是否已收录的功能
    • laravel与thinkphp之间的区别与优缺点
    • Photoshop制作海底以透明泡泡组成的艺术字
    • Photoshop创建梦幻迷离的彩虹背景
    • 一行代码实现全站pjax无刷新加载
    • Js实现动态的仿百度“元宵节汤圆”特效
    • 一起聊聊JavaScript函数式编程
    • photoshop制作蟒蛇皮纹字效果
    • PhotoShop绘制水晶质感3D立体按钮制作教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有