PHP 7.4 的 FFI 将支持更好地在 PHP 中使用 C 函数/数据结构

来源: OSCHINA
编辑: 局长
2019-10-31

即将在下月底发布的 PHP 7.4 将会引入一个有趣的新功能,那就是期待已久的对 FFI(外部函数接口,Foreign Function Interface)的支持。此功能使得开发者可以在原生 PHP 代码中调用 C 定义的函数/变量/数据结构。

FFI 与预加载功能都将是 PHP 7.4 的重要新功能,FFI 还增强了 PHP FPM systemd 服务、用于 OpenSSL 流的 TLS 1.3 以及许多其他更改。PHP 7.4 的 FFI 甚至可与其他语言的 FFI 实现相媲美。

使用 PHP FFI 应该可以减少为 C 库/程序接口编写新 PHP 模块的需求,因为现在可以使用外部函数接口来完成了。如果你对 PHP 7.4 FFI 的示例代码感到好奇,负责 Fedora/RedHat 的 PHP 打包程序工程师 Remi Collet 撰写了一篇新的博客文章,其中概述了一些带有示例代码的用例。

下面摘录一个简单的例子:

Redis 客户端

目前存在使用 C 或 PHP 编写的 Redis 客户端的各种实现,此示例演示了使用 FFI 来访问 hiredis 库的函数。

  1. 定义库,从库的头文件 hiredis/hredis.h 和 hiredis/read.h 复制/粘贴:preload-redis.h
  2. 对需要预加载的 Remi\Redis 类进行定义:preload-redis.inc
  3. 使用此类的测试脚本:redis.php

输出摘要

$ php74 -d ffi.preload=preload-redis.h -d opcache.preload=preload-redis.inc redis.php
...
+ Remi\Redis::__construct(localhost, 6379)
+ Remi\Redis::initFFI()
+ Remi\Redis::del(foo)
int(1)
+ Remi\Redis::get(foo)
NULL
+ Remi\Redis::set(foo, 2019/10/23 12:45:03)
string(2) "OK"
+ Remi\Redis::get(foo)
string(19) "2019/10/23 12:45:03"
+ Remi\Redis::__destruct

如果希望了解有关 PHP 7.4 FFI 的更多信息,可以查看 PHP.net 上的文档及其基本示例。在发布 PHP 7.4 GA 前估计会经历多个 RC 版本,GA 预计将在 11 月 28 日左右发布。

展开阅读全文
7 收藏
分享
加载中
精彩评论
这才是发版本,不像某node,改一行也发个版本,跟闹着玩似的
2019-10-31 09:41
19
举报
另外,PHP7.4还有一个重量级特性opcache.preload.
https://wiki.php.net/rfc/preload
opcache.preload可以实现PHP类和函数的内存常驻,避免每次请求都定义一次类和函数,从而提升网站性能.
在ZendFramework框架的测试中,开启预加载(opcache.preload)后性能提升30%到50%,框架越庞大,提升越明显.

不启用opcache.preload时,opcache需要额外做的工作:
1.需要检查源文件是否被修改(当然也可以设置为不检查).
2.需要将类和函数的某些部分从共享内存缓存复制到进程内存.
3.每个请求都需要重新链接类的依赖项.
2019-10-31 09:47
8
举报
对于PHP的推广和实用性并不大,基于协程的自包含模式,才是大家想要的。搞这么复杂,搞这么多花活,只会增加学习成本、部署成本。
2019-10-31 10:37
4
举报
支持!
2019-10-31 09:01
4
举报
php一年一个大版本,一个版本的更新内容够某node发10个版本了,呵呵
2019-10-31 22:11
3
举报
最新评论 (36)
php缺少的是线程
2019-11-06 22:16
0
回复
举报
c语言不好吗?非得争得面红耳赤
2019-11-04 14:39
0
回复
举报
我司也算是swoole重度用户,swoole创始人在我司待过3年,2.0和4.0都是期间发布的。然而我司内部对swoole评价也是褒贬不一,不少项目选择了GO和JAVA。对swoole吐槽最多的就是文档太差,有些文档里该有的东西,却只能问开发者。
2019-11-01 00:43
1
回复
举报
swoole有全中文文档,总比那些只有英文文档强多了,翻译成中文也是缺胳膊少腿的,无论哪个语言或项目,基本都是国外的,很少有swoole这种中文项目,就算文档做的不够完美,但相比其他的还是强多了,的至于某node教徒,我都懒得搭理,纯属自己自娱自乐,吹node还带上java,整个osc我就没见过第二个有这么傻的
2019-11-01 13:06
1
回复
举报
良心话,中国人写文档不行。还是要学英文,毕竟全世界共同交流的语言是英文。
2019-11-01 14:12
0
回复
举报
你得考虑英文水平,英文水平不强,英文文档等于没有
2019-11-01 15:07
1
回复
举报
有没有中文文档,区别不大,我们开始用Kotlin的时候,第一本英文书都还没出版,但是官网文档写的好,完全无障碍。现在的开发者,至少是本科以上学历了,学了十几年的英语,要是连英文文档都看的吃力,我也不知道该如何评价了。
2019-11-01 21:41
0
回复
举报
php一年一个大版本,一个版本的更新内容够某node发10个版本了,呵呵
2019-10-31 22:11
3
回复
举报
说白了,php没多少人开发,也没资金支撑,比如JIT 赶上哪吒了。所以才更新慢。
酸隔壁 node.js 和 java 干啥? 人家参与开发的人多。 引擎也有专门的人搞。迭代就是快,现在都是每年两个大版本,拿什么酸?
2019-10-31 20:33
1
回复
举报
我大PHP还能再续十年
2019-10-31 17:27
0
回复
举报
弱弱问一下,是不是以后PHP可以愉快地调用C库了?
2019-10-31 15:57
0
回复
举报
对,终于赶上 2010年的node.js 和py了...
不过node.js 还有个NAPI 能抹平大版本差异。
php 以后应该也会有个 PAPI ,不然针对不同版本的php得编译不同版本的 拓展。
另外 C艹 做拓展要比 C好用....
2019-10-31 20:27
1
回复
举报
最近十年,PHP领域值得赞美的改进有两个,一个是php7,另一个是swoole,其它都是无关痛痒
2019-10-31 15:31
0
回复
举报
还有JIT ,不过这都做了快4年了。
php 的迭代速度,我觉得别的主流语言有这个时间,把JIT 都做出来优化好几遍了。
swoole 和 php7 是有性能提升,可是后劲不足,迭代慢是硬伤
2019-10-31 20:30
1
回复
举报
说到底PHP还是缺乏场景,大公司看不上,小公司却早就够用了。尤其现在,PHP换Go很方便,swoole文档约等于没有,资料也很少。
2019-10-31 20:53
2
回复
举报
php一年一个大版本,一个版本够node发10个版本,swoole就更别提了,一个月一个版本,这叫迭代慢?BAT跟今日头条都在用php,没有大公司用? php换go的方便之处在哪呢?举个具体例子来说说,说swoole文档少,你是不是连swoole官网都不知道在哪呢?整个官网都是文档你说没文档,别说你看不懂,那只能说明你笨
2019-10-31 22:42
2
回复
举报
听说ffi String的性能消耗很大,这是硬伤。
2019-10-31 12:25
0
回复
举报
这不是早发过了吗
2019-10-31 11:31
0
回复
举报
更多评论
39 评论
7 收藏
分享
返回顶部
顶部