上一遍介绍PHPUnit时,下载的PHPUnit是个Phar格式的文件并且可以独立运行。Phar归档是PHP 5.3增加的新特性,借鉴了JAVA中的JAR归档,可以将整个目录下的文件打包成单个可执行文件。虽然单个PHP文件也是可执行(Composer的install就是单个PHP文件执行创建对应的Phar),但是显得不方便。
Phar的创建、引用、解压、转换均可以在PHP中完成。要创建Phar需要更改php.ini如下
1 2 | ;phar.readonly = On phar.readonly = Off |
首先在swoole\server目录下创建一个需要打包的文件swoole.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?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
1 2 | <?php require 'server/swoole.php' ; |
测试一下是否能正常运行
1 2 3 | [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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?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" ; |
进行打包
1 2 | [root@vagrant-centos64 swoole]$ php build.php Finished swoole.phar |
测试执行一下
1 2 3 | [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)里面引用,例如
1 2 3 4 | <?php include 'swoole.phar' ; //引用里面的文件 //include 'phar://swoole.phar/server/swoole.php'; |
SegmentFault便是将PHP打包成Phar进行发布的。
打包完成后,也可以将Phar转成Zip格式或解压出来,比如解压PHPUnit
1 2 3 4 | <?php $phar = new Phar( 'phpunit.phar' ); $phar ->convertToExecutable(Phar::ZIP); //$phar->extractTo('phpunit'); |
刚才我们这样运行的:php swoole.phar,就是还需要在PharP包前面还要加一个php。如果想做成直接可运行的Phar包,可以像单个PHP可执行文件那样在文件开头加上:#!/usr/bin/env php
1 2 3 4 5 6 | $phar ->setStub("#!/usr/bin/env php <?php Phar::mapPhar( '{$file}' ); require 'phar://{$file}/index.php' ; __HALT_COMPILER(); ?>"); |
运行一下
1 | . /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简介