上一遍介绍PHPUnit时,下载的PHPUnit是个Phar格式的文件并且可以独立运行。Phar归档是PHP 5.3增加的新特性,借鉴了JAVA中的JAR归档,可以将整个目录下的文件打包成单个可执行文件。虽然单个PHP文件也是可执行(Composer的install就是单个PHP文件执行创建对应的Phar),但是显得不方便。
Phar的创建、引用、解压、转换均可以在PHP中完成。要创建Phar需要更改php.ini如下
;phar.readonly = On phar.readonly = Off
首先在swoole\server目录下创建一个需要打包的文件swoole.php
<?php $serv = new swoole_server("127.0.0.1", 9002); $serv->set(array( 'worker_num' => 8, //工作进程数量 'daemonize' => true, //是否作为守护进程 )); $serv->on('connect', function ($serv, $fd){ echo "Client:Connect.\n"; }); $serv->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, 'Swoole: '.$data); $serv->close($fd); }); $serv->on('close', function ($serv, $fd) { echo "Client: Close.\n"; }); $serv->start();
在swoole目录下面创建index.php
<?php require 'server/swoole.php';
测试一下是否能正常运行
[root@vagrant-centos64 swoole]php index.php [root@vagrant-centos64 swoole]# netstat -apn | grep 9002 tcp 0 0 127.0.0.1:9002 0.0.0.0:* LISTEN 8436/php
在swoole目录下创建执行打包操作的文件build.php
<?php $dir = __DIR__; // 需要打包的目录 $file = 'swoole.phar'; // 包的名称, 注意它不仅仅是一个文件名, 在stub中也会作为入口前缀 $phar = new Phar(__DIR__ . '/' . $file, FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME, $file); // 开始打包 $phar->startBuffering(); $phar->buildFromDirectory($dir); $phar->delete('build.php'); // 设置入口 $phar->setStub("<?php Phar::mapPhar('{$file}'); require 'phar://{$file}/index.php'; __HALT_COMPILER(); ?>"); $phar->stopBuffering(); // 打包完成 echo "Finished {$file}\n";
进行打包
[root@vagrant-centos64 swoole]$ php build.php Finished swoole.phar
测试执行一下
[root@vagrant-centos64 swoole]$ php swoole.phar [root@vagrant-centos64 swoole]# netstat -apn | grep 9002 tcp 0 0 127.0.0.1:9002 0.0.0.0:* LISTEN 8635/php
到这里swoole.phar可以单独发布执行力。也可以在其他项目(比如WEB)里面引用,例如
<?php include 'swoole.phar'; //引用里面的文件 //include 'phar://swoole.phar/server/swoole.php';
SegmentFault便是将PHP打包成Phar进行发布的。
打包完成后,也可以将Phar转成Zip格式或解压出来,比如解压PHPUnit
<?php $phar = new Phar('phpunit.phar'); $phar->convertToExecutable(Phar::ZIP); //$phar->extractTo('phpunit');
刚才我们这样运行的:php swoole.phar,就是还需要在PharP包前面还要加一个php。如果想做成直接可运行的Phar包,可以像单个PHP可执行文件那样在文件开头加上:#!/usr/bin/env php
$phar->setStub("#!/usr/bin/env php <?php Phar::mapPhar('{$file}'); require 'phar://{$file}/index.php'; __HALT_COMPILER(); ?>");
运行一下
./swoole.phar
注意如果你在window下面编辑刚才段代码的话,可能会报错:-bash: ./swoole.phar: /usr/bin/env: bad interpreter: No such file or directory。解决办法便是更改换行符为Unix格式,参见这里。
GitHub上有个项目:phar-composer可以利用Composer来打包相应的项目为单个可执行文件。
参考链接:
使用phar上线你的代码包
PHP的Phar简介
使用Phar来打包发布PHP程序
Packaging Your Apps with Phar
PHP V5.3 中的新特性,第 4 部分: 创建并使用 Phar 归档
rpm打包利器rpm_create简介