前段時間寫了幾個PHP的腳本,但是因為腳本的項目是基於composer安裝的,給別人使用的時候不太方便,就希望能夠打包成一個能直接使用的文件。 搜索了一下,發現可以使用phar打包。 假設我們有如下一個項目 入口文件是index.php,打包前的命令如下: 再添加打包腳本之前,需要先修改一下PHP的 ...
前段時間寫了幾個PHP的腳本,但是因為腳本的項目是基於composer安裝的,給別人使用的時候不太方便,就希望能夠打包成一個能直接使用的文件。
搜索了一下,發現可以使用phar打包。
假設我們有如下一個項目
入口文件是index.php,打包前的命令如下:
php php index.php
再添加打包腳本之前,需要先修改一下PHP的配置,將phar.readonly改為Off,預設為On,表示只讀,在php.ini文件中:
[Phar]
; http://php.net/phar.readonly
phar.readonly = Off
編寫構建phar包的腳本,命名為build.php
<?php
$exts = ['php']; // 需要打包的文件尾碼
$dir = __DIR__; // 需要打包的目錄
$file = 'test.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');
// 設置入口
$phar->setStub($phar->createDefaultStub('index.php'));
$phar->stopBuffering();
// 打包完成
echo "Finished {$file}\n";
執行php build.php
就可以看到生成的test.phar包了。
執行php test.phar
就跟之前執行php index.php
的效果一樣了。
參考摘錄: