国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

PHP編譯器BPC編譯實(shí)戰(zhàn): workerman/GatewayWorker

heguangyu5

不了解BPC是什么的可以翻看之前的貼子.

簡(jiǎn)言之,BPC可以將PHP代碼最終轉(zhuǎn)譯成C語(yǔ)言,然后編譯成動(dòng)態(tài)鏈接庫(kù)或者可執(zhí)行程序,實(shí)現(xiàn) PHP Native AOT.

how BPC works

1. 背景

最近在做一個(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)境.

2. PHP編譯器BPC用前須知

  1. BPC target 的目標(biāo)是 php 7.2, 更精確地說(shuō)是 php 7.2.19
  2. 測(cè)試用例參看 bpc-php-7.2.19-tests
  3. BPC不支持的語(yǔ)法特性可以使用 phptobpc 進(jìn)行轉(zhuǎn)換,如果 phptobpc 也不支持,那就只能修改你的代碼或者等待BPC升級(jí)了.
  4. BPC當(dāng)前不支持的擴(kuò)展一般不是大問(wèn)題,因?yàn)锽PC的擴(kuò)展開(kāi)發(fā)是比較容易的.
  5. 目前BPC及其編譯產(chǎn)物僅在 ubuntu 18.04 amd64 上完善測(cè)試過(guò),在其它linux發(fā)行版上有可能能運(yùn)行,大概率會(huì)遇到問(wèn)題.但這并不是說(shuō)BPC無(wú)法在其它發(fā)行版上運(yùn)行,我曾在自己的 CubieBoard 7 上的 debian stretch 系統(tǒng)下成功編譯并跑通了 phpt 測(cè)試.

3. BPC支持編譯的 workerman/GatewayWorker 版本

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 分支.

4. 為了能夠成功編譯,需要對(duì) workerman/GatewayWorker 源碼做哪些調(diào)整?

workerman

  1. 在編譯的場(chǎng)景下, __DIR__ 的語(yǔ)義發(fā)生了變化,所以涉及到讀寫(xiě)文件的__DIR__都需要調(diào)整一下.

  2. BPC不支持STREAM_CLIENT_ASYNC_CONNECT, 所以不能用 AsyncTcpConnection.php.我寫(xiě)了一個(gè) SyncTcpConnection.php 來(lái)替代 AsyncTcpConnection.php,兩者的區(qū)別在于最開(kāi)始建立連接是同步還是異步,其它都一樣.

  3. BPC實(shí)現(xiàn)的__destruct()不適用于workerman這種需要長(zhǎng)時(shí)間運(yùn)行的程序,所以有 __destruct() 方法的類都做了調(diào)整.

  4. 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

  1. 用到 AsyncTcpConnection 的地方都換成了 SyncTcpConnection

  2. BPC不支持class_alias, 所以代碼中的 class_alias('GatewayWorker\Protocols\GatewayProtocol', 'Protocols\GatewayProtocol'); 都去掉了,需要在自己的項(xiàng)目里加一個(gè)如下的class.

    <?php
    namespace Protocols;
    class GatewayProtocol extends \GatewayWorker\Protocols\GatewayProtocol
    {}
  3. 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.

5. 怎么編譯 workerman 4.1 和 GatewayWorker 3.x ?

  1. 首先需要安裝 bpc-compilerphptobpc

  2. 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
  3. 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.

6. 在 BPC Playground 里立即嘗試

https://bpc.dev Try it online (BPC Playground) 里已經(jīng)加上了 workerman 和 GatewayWorker 示例.

不想自己安裝編譯環(huán)境的可以使用這個(gè) online compiler 立即嘗試編譯 workerman 和 GatewayWorker 應(yīng)用.

workerman.png

GatewayWorker.png

1752 4 1
4個(gè)評(píng)論

happy321

謝謝 建議多優(yōu)化workerman PHP源碼加密就靠你這個(gè)項(xiàng)目啦

  • 暫無(wú)評(píng)論
JackDx

關(guān)注

  • 暫無(wú)評(píng)論
sanye

6666

  • 暫無(wú)評(píng)論
songshu

你這完全可以做成一個(gè)插件了,估計(jì)用的人還蠻多

  • 暫無(wú)評(píng)論
年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表評(píng)論

heguangyu5

2250
積分
0
獲贊數(shù)
0
粉絲數(shù)
2022-11-24 加入
??