BPC 是一個 PHP Native Compiler,可以將 PHP 源碼最終轉(zhuǎn)譯成 C 語言,然后編譯成動態(tài)鏈接庫或可執(zhí)行程序.
BPC 還內(nèi)置軟件授權(quán)機(jī)制,最終可實現(xiàn)源碼保護(hù)、軟件授權(quán)、二進(jìn)制打包三合一!
徹底解決 PHP 項目的交付問題.
寫在前面:
之前就有網(wǎng)友提過能不能編譯ThinkPHP,我也翻看過幾次ThinkPHP的代碼,雖然ThinkPHP帶有測試用例,但是一眼看去很少,不清楚能覆蓋到多少功能點(diǎn).
再加上我自己從沒寫過ThinkPHP的項目,對ThinkPHP很陌生,所以一直沒有嘗試編譯.
由于php的動態(tài)性和bpc與php的高兼容特點(diǎn),bpc編譯通過不代表就沒問題了,如果有測試用例保障的話,通過運(yùn)行測試用例可以驗證編譯后的二進(jìn)制可執(zhí)行文件是否與原來的php等同.
之前寫的一本關(guān)于PHPUnit的電子書《PHPUnit in Action --- The Easy Way》里有一個博客項目 OurBlog,雖然功能很簡單,但基本的CURD都涉及到了,測試也非常完整.
于是就想著把OurBlog遷移到ThinkPHP試一下,由于有測試保障,這個遷移應(yīng)該比較好做.
一番折騰之后,遷移成功了! 源碼見: bpc-thinkphp8-ourblog
在使用 composer 創(chuàng)建 ThinkPHP 項目時,可以看到一個ThinkPHP8項目有以下依賴:
league/mime-type-detection (1.15.0)
league/flysystem (2.5.0)
psr/container (2.0.2)
psr/http-message (1.1)
psr/simple-cache (3.0.0)
psr/log (3.0.0)
symfony/polyfill-mbstring (v1.29.0)
symfony/var-dumper (v7.1.1)
topthink/think-helper (v3.1.6)
topthink/think-orm (v3.0.20)
topthink/framework (v8.0.3)
topthink/think-filesystem (v2.0.2)
topthink/think-trace (v1.6)
進(jìn)一步地,跑通 OurBlog 測試用例, 只需要搞定3 個依賴就可以了:
最后,ourblog的前端界面能正常運(yùn)行,不需要搞定所有依賴,只需要搞定下邊4個就行了:
由于 topthink/framework 和 think-orm 里都包含了 think\Facade
和 think\Exception
, 需要把 think-orm/stubs
獨(dú)立出來, 再加上 ourblog 項目本身,一共 9 個 repo, 見這里.
要想一行代碼不動就能編譯成功,幾乎是不可能的.
代碼調(diào)整主要集中在3個方面:
is_file/is_dir/file_exists/glob
來判斷,要換用 bpc 自己的專有函數(shù).代碼調(diào)整的細(xì)節(jié)可以查看每個repo的 commit 歷史.
tp8-ourblog-althttpd-ubuntu-24.04-amd64
詳見: bpc-thinkphp8-ourblog release v0.1
后邊可以出個視頻來演示一下整個編譯運(yùn)行的過程.
對于 workerman / webman 來說, BPC 7.3 帶來兩個好處: