PHP FFI详解 - 一种全新的PHP扩展方式 (www.laruence.com)

【简介】

随着PHP7.4而来的有一个我认为非常有用的一个扩展:PHP FFI(Foreign Function interface), 引用一段PHP FFI RFC中的一段描述:For PHP, FFI opens a way to write PHP extensions and bindings to C libraries in pure PHP.

是的,FFI提供了高级语言直接的互相调用,而对于PHP来说,FFI让我们可以方便的调用C语言写的各种库。

其实现有大量的PHP扩展是对一些已有的C库的包装,比如常用的mysqli, curl, gettext等,PECL中也有大量的类似扩展。

传统的方式,当我们需要用一些已有的C语言的库的能力的时候,我们需要用C语言写wrapper,把他们包装成扩展,这个过程中就需要大家去学习PHP的扩展怎么写,当然现在也有一些方便的方式,比如Zephir. 但总还是有一些学习成本的,而有了FFI以后,我们就可以直接在PHP脚本中调用C语言写的库中的函数了。

而C语言几十年的历史中,积累了大量的优秀的库,FFI直接让我们可以方便的享受这个庞大的资源了。

点击查看原文 >>

@技术头条 2021-05-28 08:32 / 原作者微博:@Laruence / 0个评论
赞过的人: @IT技术博客大学习
要不要再学学下面的文章?
以非阻塞方式执行一个函数 (blog.codingnow.com)
用过 skynet 的应该都碰到过:当我们在服务中不小心调用了一个长时间运行而不返回的 C 函数,会独占一个工作线程。同时,这个被阻塞的服务也无法处理新的消息。一旦这种情况发生,看似是无解的。我们通常认为,是设计问题导致了这种情况发生。skynet 的框架在监测到这种情况发生时,会输出 maybe in an endless loop 。

如果是 Lua 函数产生的死循环,可以通过发送 signal 打断正在运行运行的 Lua 虚拟机,但如果是陷入 C 函数中,只能事后追查 bug 了。

那么,如果我原本就预期一段 C 代码会运行很长时间,有没有可能从底层支持以非阻塞方式运行这段代码呢?即,在这段代码运行期间,该服务还可以接收并处理新的消息?
by @技术头条 2024-03-13 13:20 查看详情
BitTorrent 扩展协议(Extension Protocol)详解 (www.addesp.com)
BitTorrent 扩展协议(Extension Protocol)为 BitTorrent 协议簇提供了一个简单而轻量的扩展方式,可以在保证兼容性的同时为协议加入新的功能。比如基于 DHT 协议 的磁力链接就是使用扩展协议加入的新功能。

本文将介绍 BT 扩展协议的报文格式和时序。
by @技术头条 2024-01-13 23:25 查看详情
分布式散列表协议 —— Kademlia 详解 (www.addesp.com)
散列表是一种由键值对组成的列表。你可以把它看作一部字典,只需要经过少数的几步就能通过某种信息找到需要的信息,查询速度很快。

分布式散列表就是由一个网络内所有的节点共同维护的一种散列表,这类散列表通常十分巨大,或者压根不可能由单个机器或者某机组机器维护。

Kademlia 协议由 Petar Maymounkov 和 David Mazières 设计。它可以在容易出错的环境(比如节点会毫无征兆地下线)中建立一张分布式散列表。
by @技术头条 2023-12-26 22:36 查看详情
BitTorrent 分布式散列表(DHT)协议详解 (www.addesp.com)
DHT 协议大幅度提高了 BitTorrent 网络的容错性,使整个网络难以因 Tracker 服务器的下线而崩溃,而这一切的外在表现就是“磁力链接”。
by @技术头条 2023-12-26 22:35 查看详情
BitTorrent Tracker 协议详解 (www.addesp.com)
BitTorrent 网络内的主机依靠互相交换自身持有的资源来完成资源共享,而 Tracker 协议会告诉你哪些主机有你需要的资源。

本文将详细介绍 Tracker 协议。
by @技术头条 2023-12-26 22:34 查看详情
技术 | Btrfs 详解:快照 (linux.cn)
想象一下,你长时间处理一个文件,反复添加和撤销修改。然后,在某个时刻你意识到:两小时前你撤销的部分修改,现在会非常有用。而昨天在你销毁那个设计之前,你也已经修改了这个特殊的部分。当然,由于你会定期保存文件,所以旧的改动会丢失。很多人可能都遇到过这样的情况。如果能恢复旧版本的文件,而无需定期手动复制,岂不美哉?

这是一个 Btrfs 快照可以帮助你的特别场景。当你使用正确的话,快照同时也为你的电脑提供了很好的备份方案。
by @技术头条 2023-10-24 23:57 查看详情
使用 SQL 的方式查询消息队列数据以及踩坑指南 (crossoverjie.top)
为了让业务团队可以更好的跟踪自己消息的生产和消费状态,需要一个类似于表格视图的消息列表,用户可以直观的看到发送的消息;同时点击详情后也能查到消息的整个轨迹。
by @技术头条 2023-09-10 23:23 查看详情
实现 go 的 goroutine 本地存储又一种方式 (xiezhenye.com)
go 本身没有对外提供 goroutine 本地存储,而现实中,又经常需要在上下文中传递一些数据。使用 context 也是一种方式,但是要求在所有需要的地方都要传递,还是非常麻烦,而且有侵入性。
偶然发现 go 已经提供了一个用于 profile 的 pprof label,可以在 goroutine 中携带一些数据。不过这个东西既然是用于 pprof 的,随意往里塞太多东西显然也不适合,还会对 pprof 产生干扰。所以,想办法只用其中一个 label,用一些黑科技把一个 map 放了进去,将影响降到最小。同时,pprof 包中已经有一些基于 context 访问处理 label 的逻辑,所以还要做一些兼容处理,避免被其覆盖。
by @技术头条 2023-07-04 23:07 查看详情
Spring 扩展点概览及实践 (www.diguage.com)
学习 Spring 代码,最重要的是掌握 Spring 有哪些扩展点,可以利用这些扩展点对 Spring 做什么扩展操作。说得更具体一点,如果自己开发一个框架,如何与 Spring 进行整合,如果对 Spring 的扩展点有一个比较清晰的认识,势必会事半功倍。
by @技术头条 2023-06-24 23:29 查看详情
Nginx实现http和https复用1个端口的2种解决方式 (hugo.111520.xyz)
本文介绍在无法使用80,443标准端口情况下,通过Nginx复用1个端口实现访问http和https的两种方式。
by @技术头条 2023-06-24 23:21 查看详情