不了解 BPC 是什么的可以翻看之前的贴子.
简言之,BPC 可以将 PHP 代码最终转译成 C 语言,然后编译成动态链接库或者可执行程序,实现 PHP Native AOT.
最近在做一个招聘求职类的项目,B 端 HR 使用的是云招 OurATS 招聘管理系统,C 端求职者使用的是微信小程序.
HR 在 B 端创建的职位会显示在微信小程序上,求职者在小程序上可以浏览职位信息,就某职位和 HR 在线聊天沟通.
求职者投递简历后,也可以就此次投递和 HR 在线聊天沟通.
其中在线聊天功能是基于 workerman/GatewayWorker 实现的.
整个项目(OurATS+小程序后端+在线聊天)都使用 PHP 开发,交付给客户时,经 BPC 编译成.so 和 elf 可执行文件部署到客户的服务器上.
虽然之前就尝试着编译过 workerman,但毕竟不是真刀真枪的项目,$eventLoopClass
用的还是Select
.
借着这个在线聊天的机会,BPC 实现了event(core)
扩展,针对 BPC 调整了部分 workerman/GatewayWorker 的代码,把 BPC 编译版本的 workerman/GatewayWorker 推向生产环境.
workerman
workerman 在 5.0 新版本中引入了 Typed Properties 特性. 也就是如下代码:
class Worker
{
public int $id = 0; // 注意 public 和 $id 中间的 int
}
BPC 目前不支持这一特性,所以不支持编译 workerman 5.0 版本.
BPC 当前调整好的,可以编译,基本测试没问题的版本是 workerman 4.1 版本.
Gatewayworker
GatewayWorker master 分支引入了 class method 的返回类型.也就是如下代码:
class BusinessWorker extends Worker
{
public function run(): void // 注意 run() 后边的 : void
{}
}
BPC 目前不支持这一特性,所以不支持编译 GatewayWorker master 分支.
BPC 当前调整好的,可以编译,基本测试没问题的版本是 GatewayWorker 3.x 分支.
workerman
在编译的场景下, __DIR__
的语义发生了变化,所以涉及到读写文件的__DIR__
都需要调整一下.
BPC 不支持STREAM_CLIENT_ASYNC_CONNECT
, 所以不能用 AsyncTcpConnection.php.我写了一个 SyncTcpConnection.php 来替代 AsyncTcpConnection.php,两者的区别在于最开始建立连接是同步还是异步,其它都一样.
BPC 实现的__destruct()
不适用于 workerman 这种需要长时间运行的程序,所以有 __destruct()
方法的类都做了调整.
BPC 实现的 event 扩展对于长期运行的程序需要手动 free event,所以对Events/Event.php
做了调整.
大的调整就这 4 点,具体细节可以查看 github commits.
GatewayWorker
用到 AsyncTcpConnection 的地方都换成了 SyncTcpConnection
BPC 不支持class_alias
, 所以代码中的 class_alias('GatewayWorker\Protocols\GatewayProtocol', 'Protocols\GatewayProtocol');
都去掉了,需要在自己的项目里加一个如下的 class.
<?php
namespace Protocols;
class GatewayProtocol extends \GatewayWorker\Protocols\GatewayProtocol
{}
BPC 实现的 pdo 扩展对于长期运行的程序需要明确的调用 $pdo->closeConnection()
和 $stmt->destroy()
, 所以对 src/Lib/DbConnection.php
做了调整.
大的调整就这 3 点,具体细节可以查看 github commits.
首先需要安装 bpc-compiler 和 phptobpc
git clone git@github.com:bob-php-compiler/bpc-workerman-4.1-branch.git
cd bpc-workerman-4.1-branch
make
cd Workerman
sudo bpc -l workerman --install
git clone git@github.com:bob-php-compiler/bpc-GatewayWorker-3.x-branch.git
cd bpc-GatewayWorker-3.x-branch/src
make
cd ../GatewayWorker
sudo bpc -l gatewayworker --install
现在 workerman 和 gatewaywoker 已经被编译成 .so 和 .a 并安装到 /usr/local/lib
目录下了.
接下来在编译 workerman 和 GatewayWorker 应用时只需要给 bpc 加上 -u workerman
-u gatewayworker
就可以了.
关于 BPC 的高级用法请看 Wiki: 05_Advanced_usage.
https://bpc.dev Try it online (BPC Playground) 里已经加上了 workerman 和 GatewayWorker 示例.
不想自己安装编译环境的可以使用这个 online compiler 立即尝试编译 workerman 和 GatewayWorker 应用.
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.