
一款将 PHP 代码编译为原生代码的编译器。它仅处理 PHP 的子集代码,并直接将其编译为原生汇编代码,从而生成可在当前支持的目标平台上运行的独立二进制文件:macOS ARM64、Linux ARM64 以及 Linux x86_64。该编译器不需要解释器、虚拟机,也无需 Zend Engine 或操作码回退机制。
支持平台:macOS、Linux
cargo)as、ld)macOS:安装 Xcode 命令行工具
xcode-select --install
这会提供 elephc 需要的汇编器 as 和链接器 ld。
Linux:安装发行版的原生工具链,使 as、ld 以及 libc 开发文件可用。
brew install illegalstudio/tap/elephc
验证安装是否成功:
echo '<?php echo "ok\n";' > check.php
elephc check.php && ./check
输出 ok 即表示成功,确认 elephc 可以生成并运行原生二进制文件。
如果你喜欢从源码构建,也需要 Rust 工具链:
git clone https://github.com/illegalstudio/elephc.git
cd elephc
cargo build --release
编译后的二进制文件位于 ./target/release/elephc。你可以将其复制到 PATH 目录:
cp target/release/elephc /usr/local/bin/
预构建的二进制文件可以在 GitHub Release 页面 找到。
下载对应平台的 artifact,添加可执行权限并移动到 PATH:
chmod +x elephc
mv elephc /usr/local/bin/
创建文件 hello.php:
<?php
echo "Hello, World!\n";
编译:
elephc hello.php
会生成同目录下的原生二进制文件 hello。运行它:
./hello
输出:
Hello, World!
这就是全部:一个完全独立的原生二进制文件,无需 PHP 解释器。
创建 greet.php:
<?php
if ($argc < 2) {
echo "Usage: ./greet <name>\n";
exit(1);
}
$name = $argv[1];
echo "Hello, " . strtoupper($name) . "!\n";
编译并运行:
elephc greet.php
./greet elephc
输出:
Hello, ELEPHC!
程序通过 argc 和 argv 读取命令行参数(与 PHP 完全一致)。
经典示例,展示变量、循环和条件判断:
<?php
for ($i = 1; $i <= 100; $i++) {
if ($i % 15 == 0) {
echo "FizzBuzz\n";
} elseif ($i % 3 == 0) {
echo "Fizz\n";
} elseif ($i % 5 == 0) {
echo "Buzz\n";
} else {
echo $i . "\n";
}
}
编译运行:
elephc fizzbuzz.php
./fizzbuzz
运行 elephc hello.php 时,编译器会执行以下步骤:
--define 的 ifdef 分支spl_autoload_register() 规则构建编译时自动加载注册表include / require 文件,预扫描静态可解析的 include 声明,折叠编译时包含路径,并降低 *_once 运行时保护.s / .o 文件组装成原生可执行文件中间的 .s 和 .o 文件会自动清理。你最终会得到一个单个可执行文件。
如果你想更深入查看编译过程,以下是良好起点:
elephc --timings hello.php
elephc --emit-asm --source-map hello.php
--timings 会报告词法分析、解析、早期优化、类型检查、常量传播、后检查剪枝、控制流规范化、死代码消除、运行时缓存准备、代码生成、汇编和链接等阶段。
--source-map 会将 hello.map JSON 文件写入 hello.s 旁边。该文件记录哪些汇编代码行来源于哪个 PHP 源代码行和列。
如果你想对比 elephc 与 PHP 解释器和等效的 C 固定装置,请查看 基准测试套件