PHP編譯器BPC 6.0釋出,支援namespace,支援closure,成功編譯 workerman

heguangyu5發表於2022-11-24

release地址: github.com/bob-php-compiler/bpc-re...

使用指南: github.com/bob-php-compiler/bpc-re...

不瞭解BPC是什麼的可以翻看之前的帖子.

簡言之,BPC可以將PHP程式碼最終轉譯成C語言,然後編譯成動態連結庫或者可執行程式.

BPC 5.0已經能夠成功編譯Zend Framework 1和我們公司自己的諸多專案.

但要想更廣泛的應用,還缺兩個大特性:

  1. namespace
  2. closure

1. 支援 namespace

前些天看到 nikic/PHP-Parser文件, 發現PHP的namespace可以很容易地轉化.

於是就照著文件寫了一個 phptobpc.php, 藉助這個小程式,可以將使用namespace的PHP程式碼轉為沒有namespace的.

當然BPC自身也做了相應的支援,這樣動態呼叫也沒問題.比如:

<?php
$classname = '\\Foo\\Bar\\Baz';
$o = new $classname;

我把這個程式打包成 phptobpc.phar, 下載回來 chmod +x 就能使用.

2. 支援 closure

BPC之前就已經支援簡單的匿名函式,比如:

<?php
$a = array(1,2,3);
usort($a, function ($a, $b) { ... });

BPC 6.0完善了closure實現,支援use,typehint,default value等特性,比如:

<?php
$a = 1;
$b = 2;
$f = function (array $arg1, &$arg2, $arg3 = 1) use ($a, &$b) { ... };

3. 成功編譯 workerman

之前有網友說能不能把 workerman 整個編譯起來.

現在支援了 namespace 和 closure, 正好可以編譯 workerman 試一試.

由於編譯後執行和PHP解釋執行還是有一些區別,要想成功編譯和執行,需要對workerman的程式碼做一些微調.

整體來說,調整量很小.感興趣的可以去檢視 git commit .

由於 workerman 沒有 unit tests, 我們自己也沒有 workerman 的專案,所以不好做完整的驗證.

但我照著 workerman手冊, 寫了以下幾個例子:

  1. start.php
  2. ws_test.php
  3. tcp_test.php
  4. SimpleChat.php
  5. BinaryTransfer.php
  6. TextTransfer.php

執行起來,測試了一下,沒有問題.

start start -d stop restart status connections 這些命令都OK.

但是由於編譯後只有一個二進位制檔案,reload顯然是達不到預期效果的.

這幾個例子我都靜態編譯出來了,想動手試一下的直接 下載 回來 gunzip 然後 chmod +x 執行即可 (注意只能在ubuntu 18.04上執行).

想自己動手編譯的,參看 src/Makefileexamples/build.sh

4. 幾個常見問題?

  1. BPC是否開源?

    BPC是我們公司的內部專案,不打算開源.

    商業化策略還未確定,在正式商業化前,我們每次release都會帶一個約7天的試用license,如果過期了還想試用,只要給我們發個郵件我們就會再給license.

    如果想要就此專案進行深度合作,可以發郵件到 YnBjQG91cmF0cy5jb20=

  2. BPC 和 VKCOM/kphp 以及 peachpiecompiler/peachpie 有什麼區別?

    BPC的目標是原始碼保護和軟體授權(最終編譯為C),在此基礎上儘可能和PHP相容,也就是說,一個php指令碼最好什麼都不改就能編譯成二進位制.

    kphp的目標是效能(編譯為C++),為此,它僅支援 limited subset of PHP, 參看 KPHP vs PHP differences

    peachpie的目標也是效能(編譯為C#),同時將.NET引進來了.

  3. BPC 和 Zend Guard, ionCube 以及 Swoole Compiler 有什麼區別?

    Zend Guard, ionCube和Swoole Compiler都是在PHP opcode的基礎上進行原始碼保護的.

    BPC應該來說和它們不是一類東西,只是目標相同罷了,BPC和kphp peachpie算是一類.

  4. PHP官方是否會做編譯器?

    PHP官方明確不做Native AOT. 參看 Ahead of Time Compiler/AOT for PHP8?

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章