专栏首页Web技术布道师PHP FFI 允许在 PHP 脚本中嵌入原始 C 代码

PHP FFI 允许在 PHP 脚本中嵌入原始 C 代码

Zend 的 Dmitry Stogov 通过允许 PHP 执行嵌入式 C 代码扩展了 PHP 的领域。 这将允许完全访问本地 C 函数,变量以及数据结构。

解决方案 PHP FFI 作为实验性扩展提供,但要求 PHP 7.3 的开发版本。 该解决方案还不能用于生产,但它构建在坚实的基础之上,使用 FFI(外部函数接口)库 libffi,允许高级语言生成代码。

输入:

<?php$libc = new FFI("    int printf(const char *format, ...);    char * getenv(const char *);    unsigned int time(unsigned int *);    typedef unsigned int time_t;    typedef unsigned int suseconds_t;    struct timeval {        time_t      tv_sec;        suseconds_t tv_usec;    };    struct timezone {        int tz_minuteswest;        int tz_dsttime;    };    int gettimeofday(struct timeval *tv, struct timezone *tz);    ", "libc.so.6");$libc->printf("Hello World from %s!\n", "PHP");var_dump($libc->getenv("PATH"));var_dump($libc->time(null));$tv = $libc->new("struct timeval");$tz = $libc->new("struct timezone");$libc->gettimeofday($tv, $tz);var_dump($tv->tv_sec, $tv->tv_usec, $tz);?>

将输出:

Hello World from PHP!string(135) "/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/dmitry/.local/bin:/home/dmitry/bin"int(1523617815)int(1523617815)int(977765)object(CData)#3 (2) {  ["tz_minuteswest"]=>  int(-180)  ["tz_dsttime"]=>  int(0)}

FFI 目前的数据结构访问还比较缓慢,比访问原始 PHP 数组和对象的速度慢大约 4 倍。现阶段的速度虽然不太乐观,但还是可以帮助节省内存和资金的。

随着 PHP FFI 后续的不断优化,性能还会不断提升。

原文: react-etc.net 编译:开源中国

本文分享自微信公众号 - PHP技术大全(phpgod),作者:开源中国

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从PHP 5到PHP 7性能全评测(含未发布的JIT版PHP 8对比)

    导读:PHP 是 Web 开发最常用的语言,每个大版本的更新都带来不少新特性和性能提升。特别是 PHP 7.0 的发布,带来 PHP 性能飞跃。本文作者对各个 ...

    猿哥
  • PHP 7.3 比 PHP 7.0 快 22%,即将进入特性冻结阶段

    随着上周 PHP 7.3 Alpha3 的发布,意味着 PHP 7.3 即将进入特性冻结阶段,不再有新的功能添加,后续的 Beta 和 RC 版本将主要进行修复...

    猿哥
  • PHP 霸主地位被动摇,JIT 是穷途末路后的绝地反击?

    TIOBE 2017 年度编程语言榜单已出炉,世界上最好的语言 PHP 再度无缘年度编程语言。

    猿哥
  • PHP 7.4 有哪些新特性

    PHP 7.4 的GA版今天正式发布了。PHP 7.4发布后,PHP 7.3或其它的PHP 7版本都可以升级到PHP 7.4版。

    Debian社区
  • 想在老牌病理期刊上发生信,你得学这篇!

    大家好,今天和大家分享的是去年10月份发表在Modern Pathology (IF:5.988)杂志上的一篇文章,“Genetic analysis of p...

    科研菌
  • 隆重介绍!CI/CD手下的开源界六大金刚

    Jenkins 2 image based on Red Hat Enterprise Linux的镜像

    魏新宇
  • scrapy去重与scrapy_redis去重与布隆过滤器

    在开始介绍scrapy的去重之前,先想想我们是怎么对requests对去重的。requests只是下载器,本身并没有提供去重功能。所以我们需要自己去做。很典型的...

    小歪
  • 一步一步解析Axios源码,从入门到原理

    一个基于 Promise 来管理 http 请求的简洁、易用且高效的代码封装库。通俗一点来讲,它是一个前端替代Ajax的一个东西,可以使用它发起http请求接口...

    用户1462769
  • Cisco软件路由器通信的搭建方法

    该实验室是由两个模拟路由器和两个模拟的终端设备进行的。试验可分为四个步骤,分别是电路的搭建、设备终端的IP地址设置、路由器的配置以及最后的实验结果验证。

    用户5935416
  • 对决!PHP vs Node.js !

    这是典型好莱坞情节:分道扬镳的两位老朋友间的战斗。摩擦经常开始于一位对另一位不言而喻的领域感兴趣。这部电影的编程语言版本是Node.js的引入将好友情节变成一场...

    疯狂的技术宅

扫码关注云+社区

领取腾讯云代金券