在我前一阵子写的一篇文章《新版 SegmentFault 重构之系统架构》中,不少人对其中提到的利用phar上线代码比较感兴趣,我就在这边跟你们分享下我目前的作法。php
其实这种方法没有什么特别的限制,只有一条,你的程序是单一入口的,对web项目也就是说,全部的http请求都只有一个php文件做为处理方(大多数程序就是index.php)。css
若是你的程序结构是这样的,那么基本能够无障碍切换到这种上线模式。实际上绝大多数现代的php框架构建的项目都是单一入口的结构了。git
若是你的代码结构比较科学(好比采用大部分框架的推荐结构),那么一行都不须要改变。只有几个须要注意github
include
或者require
来引用其余项目内文件时,最好不要直接用相对地址,而是在前面加上__DIR__
常量OK,准备工做作完后,咱们就能够开始看看具体怎么部署了。为了方便你们了解,我在github上放了一个很是简单的小例子,它的地址是web
https://github.com/SegmentFault/phar-samplesegmentfault
这个例子的代码结构跟咱们大多数项目很像,实际上我就是刻意模拟这些项目的代码结构
注意,运行这个项目最好在php 5.4以上的环境中浏览器
app
存放主要的逻辑代码,好比controller, model, service 等等lib
存放一些库文件,包括第三方的portal
其实就是项目的主入口了,打开你回发现里面只有一个文件index.php,这就是我前面提到的单一入口结构static
存放的是静态文件,好比js, css, 图片等等,这个目录须要你单独部署,咱们的phar包里不会打包里面的内容,放在这里只是为了完整地展现一个项目结构build.php
文件就是咱们的打包脚本了若是你的项目须要模版文件,可能还须要一个template
目录,在这里我就省略掉了php框架
在浏览器里访问你的项目地址/portal/index.php
,便可看到熟悉的Hello World!
字样架构
这个项目中最重要的就是build.php
这个文件了,它展现了一个通过简化的打包过程,实际上,稍加修改它就能用在你的项目中,这个文件的代码注释很详细,我就不重复说明了,如今咱们在终端下运行它app
啊哦,貌似出了点问题,不过没关系,这是php的一个选项没有设置致使的,打开php.ini
文件,找到;phar.readonly = On
这一行,把前面的分号;
去掉,而后把后面的On
改成Off
,而后保存再执行这个命令
看来成功了,并且当前目录下已经有了Sample.phar
这个打包好的文件
如今你必定对着这个phar文件感到新奇,可是又不知道如何用它,WTF!可是等等,请回到终端下执行命令
php Sample.phar
怎么样,如今你的整个项目就已经被包含在这个Sample.phar
文件里了,并且它还能直接被执行,很神奇吧,那么咱们应该怎么部署它呢?
如下是个人建议
首先为每次打包的文件生成一个版本号,好比你能够在build.php
加上一行
rename('Sample.phar', 'Sample.' . date('Ymd.His') . '.phar');
这样每次打包后的文件就变成了相似Sample.20141111.123456.phar
,并且不会重复,生成不重复id的方法有不少种,我推荐这种是由于它能够方便你看到打包时间,之后你作回滚的时候就能够知道要回滚到那个时间的版本,固然你也能够把这个版本跟你的SCM版本关联起来
而后,在线上使用另一个入口文件引用这个包,好比线上的入口目录/wwwroot
下的index.php
文件有以下代码
require __DIR__ . '/../packages/Sample.20141111.123456.phar';
是的,只有一行就这么简单!packages
就是你存放这些打包好文件的目录,你能够随意放置。
我说的这些步骤均可以很方便的写成脚本集成到你目前的自动化部署流程中。
以上的文字只是抛砖引玉,欢迎你们对这个方案提出意见,并对它作一些性能测试,若是你运行在5.5以上的版本(默认打开opcache),几乎对性能没有影响。