不了解BPC是什么的可以翻看之前的貼子.
簡(jiǎn)言之,BPC可以將PHP代碼最終轉(zhuǎn)譯成C語(yǔ)言,然后編譯成動(dòng)態(tài)鏈接庫(kù)或者可執(zhí)行程序,實(shí)現(xiàn) PHP Native AOT.
最近在做一個(gè)招聘求職類的項(xiàng)目,B端HR使用的是云招OurATS招聘管理系統(tǒng),C端求職者使用的是微信小程序.
HR在B端創(chuàng)建的職位會(huì)顯示在微信小程序上,求職者在小程序上可以瀏覽職位信息,就某職位和HR在線聊天溝通.
求職者投遞簡(jiǎn)歷后,也可以就此次投遞和HR在線聊天溝通.
其中在線聊天功能是基于 workerman/GatewayWorker 實(shí)現(xiàn)的.
整個(gè)項(xiàng)目(OurATS+小程序后端+在線聊天)都使用PHP開(kāi)發(fā),交付給客戶時(shí),經(jīng)BPC編譯成.so和elf可執(zhí)行文件部署到客戶的服務(wù)器上.
雖然之前就嘗試著編譯過(guò)workerman,但畢竟不是真刀真槍的項(xiàng)目,$eventLoopClass
用的還是Select
.
借著這個(gè)在線聊天的機(jī)會(huì),BPC實(shí)現(xiàn)了event(core)
擴(kuò)展,針對(duì)BPC調(diào)整了部分workerman/GatewayWorker的代碼,把BPC編譯版本的 workerman/GatewayWorker 推向生產(chǎn)環(huán)境.
workerman
workerman 在5.0新版本中引入了 Typed Properties 特性. 也就是如下代碼:
class Worker
{
public int $id = 0; // 注意 public 和 $id 中間的 int
}
BPC目前不支持這一特性,所以不支持編譯workerman 5.0版本.
BPC當(dāng)前調(diào)整好的,可以編譯,基本測(cè)試沒(méi)問(wèn)題的版本是 workerman 4.1 版本.
Gatewayworker
GatewayWorker master 分支引入了class method 的返回類型.也就是如下代碼:
class BusinessWorker extends Worker
{
public function run(): void // 注意 run() 后邊的 : void
{}
}
BPC目前不支持這一特性,所以不支持編譯GatewayWorker master分支.
BPC當(dāng)前調(diào)整好的,可以編譯,基本測(cè)試沒(méi)問(wèn)題的版本是 GatewayWorker 3.x 分支.
workerman
在編譯的場(chǎng)景下, __DIR__
的語(yǔ)義發(fā)生了變化,所以涉及到讀寫(xiě)文件的__DIR__
都需要調(diào)整一下.
BPC不支持STREAM_CLIENT_ASYNC_CONNECT
, 所以不能用 AsyncTcpConnection.php.我寫(xiě)了一個(gè) SyncTcpConnection.php 來(lái)替代 AsyncTcpConnection.php,兩者的區(qū)別在于最開(kāi)始建立連接是同步還是異步,其它都一樣.
BPC實(shí)現(xiàn)的__destruct()
不適用于workerman這種需要長(zhǎng)時(shí)間運(yùn)行的程序,所以有 __destruct()
方法的類都做了調(diào)整.
BPC實(shí)現(xiàn)的event擴(kuò)展對(duì)于長(zhǎng)期運(yùn)行的程序需要手動(dòng)free event,所以對(duì)Events/Event.php
做了調(diào)整.
大的調(diào)整就這4點(diǎn),具體細(xì)節(jié)可以查看 github commits.
GatewayWorker
用到 AsyncTcpConnection 的地方都換成了 SyncTcpConnection
BPC不支持class_alias
, 所以代碼中的 class_alias('GatewayWorker\Protocols\GatewayProtocol', 'Protocols\GatewayProtocol');
都去掉了,需要在自己的項(xiàng)目里加一個(gè)如下的class.
<?php
namespace Protocols;
class GatewayProtocol extends \GatewayWorker\Protocols\GatewayProtocol
{}
BPC實(shí)現(xiàn)的pdo擴(kuò)展對(duì)于長(zhǎng)期運(yùn)行的程序需要明確的調(diào)用 $pdo->closeConnection()
和 $stmt->destroy()
, 所以對(duì) src/Lib/DbConnection.php
做了調(diào)整.
大的調(diào)整就這3點(diǎn),具體細(xì)節(jié)可以查看 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
現(xiàn)在 workerman 和 gatewaywoker 已經(jīng)被編譯成 .so 和 .a 并安裝到 /usr/local/lib
目錄下了.
接下來(lái)在編譯 workerman 和 GatewayWorker 應(yīng)用時(shí)只需要給bpc加上 -u workerman
-u gatewayworker
就可以了.
關(guān)于BPC的高級(jí)用法請(qǐng)看 Wiki: 05_Advanced_usage.
https://bpc.dev Try it online (BPC Playground) 里已經(jīng)加上了 workerman 和 GatewayWorker 示例.
不想自己安裝編譯環(huán)境的可以使用這個(gè) online compiler 立即嘗試編譯 workerman 和 GatewayWorker 應(yīng)用.
謝謝 建議多優(yōu)化workerman PHP源碼加密就靠你這個(gè)項(xiàng)目啦