PHP 打包成单个可执行程序Phar

虽然PHP主要用于Web应用,但是也经常用来构建命令行代码,PHP可以将代码打包成单个应用,这样便于管理和分发,像Composer,PHPUnit等等。尤其是配合Symfony console组件,可以写出高质量的PHP命令行工具。

最近使用了nodejs的taskbook,感觉非常好用,因为他是命令行的,可以在服务器上写一些todo和备注啥的,但是也有一些问题,就是不支持导入导出,数据不是存储在数据库中,支持配分啥的,计划想使用PHP写一个类似的工具。

那么如何将PHP代码打包成Phar单个压缩包呢?,只要执行以下代码,修改相应的文件名称就行了:

<?php
$exts = ['php'];            // 需要打包的文件后缀
$dir = __DIR__;             // 需要打包的目录
$file = 'todo.phar';       // 包的名称, 注意它不仅仅是一个文件名, 在stub中也会作为入口前缀
$phar = new Phar(__DIR__ . '/' . $file, FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME, $file);
// 开始打包
$phar->startBuffering();
// 将后缀名相关的文件打包
foreach ($exts as $ext) {
    $phar->buildFromDirectory($dir, '/\.' . $ext . '$/');
}
// 把build.php本身摘除
$phar->delete('build.php');
// 设置入口
$defaultStub = $phar->createDefaultStub('todo.php');
$defaultStub = <<<STUB
#!/usr/bin/env php
$defaultStub
STUB;
$phar->setStub($defaultStub);
$phar->stopBuffering();
// 打包完成
echo "Finished {$file}\n";

Phar文件其实是一个压缩包,它并不包含PHP运行时,所以在运行的时候还是需要服务器已经安装了对应版本的PHP。