使用phar上线你的代码包

在我前一阵子写的一篇文章《新版 SegmentFault 重构之系统架构》中,很多人对其中提到的利用phar上线代码比较感兴趣,我就在这边跟大家分享下我目前的做法。

哪些项目适合phar打包上线?

其实这种方法没有什么特别的限制,只有一条,你的程序是单一入口的,对web项目也就是说,所有的http请求都只有一个php文件作为处理方(大多数程序就是index.php)。

如果你的程序结构是这样的,那么基本可以无障碍切换到这种上线模式。实际上绝大多数现代的php框架构建的项目都是单一入口的结构了。

现有代码需要做何处理吗?

如果你的代码结构比较科学(比如采用大部分框架的推荐结构),那么一行都不需要改变。只有几个需要注意

  1. 在项目里用include或者require来引用其他项目内文件时,最好不要直接用相对地址,而是在前面加上__DIR__常量
  2. 因为phar包只能解析代码文件,所以建议静态文件单独部署

OK,准备工作做完后,我们就可以开始看看具体怎么部署了。为了方便大家了解,我在github上放了一个非常简单的小例子,它的地址是

https://github.com/SegmentFault/phar-sample

从一个简单的例子说起

这个例子的代码结构跟我们大多数项目很像,实际上我就是刻意模拟这些项目的代码结构
注意,运行这个项目最好在php 5.4以上的环境中

  • app存放主要的逻辑代码,比如controller, model, service 等等
  • lib存放一些库文件,包括第三方的
  • portal其实就是项目的主入口了,打开你回发现里面只有一个文件index.php,这就是我前面提到的单一入口结构
  • static存放的是静态文件,比如js, css, 图片等等,这个目录需要你单独部署,我们的phar包里不会打包里面的内容,放在这里只是为了完整地展示一个项目结构
  • build.php文件就是我们的打包脚本了

如果你的项目需要模版文件,可能还需要一个template目录,在这里我就省略掉了

在浏览器里访问你的项目地址/portal/index.php,即可看到熟悉的Hello World!字样

这个项目中最重要的就是build.php这个文件了,它展示了一个经过简化的打包过程,实际上,稍加修改它就能用在你的项目中,这个文件的代码注释很详细,我就不重复说明了,现在我们在终端下运行它

啊哦,貌似出了点问题,不过不要紧,这是php的一个选项没有设置导致的,打开php.ini文件,找到;phar.readonly = On这一行,把前面的分号;去掉,然后把后面的On改为Off,然后保存再执行这个命令

看来成功了,而且当前目录下已经有了Sample.phar这个打包好的文件

如何部署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),几乎对性能没有影响。

https://segmentfault.com/a/1190000002166235

时间: 2024-12-28 15:31:04

使用phar上线你的代码包的相关文章

category is in invalid format hint微信第三方平台将第三方提交的代码包提交审核出错

微信第三方平台通过接口https://api.weixin.qq.com/wxa/submit_audit?access_token=TOKEN将第三方提交的代码包提交审核时一直返回错误码85008的错误信息: category is in invalid format hint 查了半天是接口提交数据时json_encode时中文不能编码提交 将向微信的提交代码     $this->https_post($url,json_encode($postData)); 改为     $this->

Meteor 中的代码包有点特殊,分为五种

Meteor 中的代码包有点特殊,分为五种: Meteor 核心代码本身分成多个核心代码包(core package),每个 Meteor 应用中都包含,你基本上不需要花费精力来维护它们 常规 Meteor 代码包称为"isopack",或同构代码包(isomorphic package,意味着它们既能在客户端也能在服务器端工作).第一类代码包例如 accounts-ui 或 appcache 由 Meteor 核心团队维护,与 Meteor 捆绑在一起. 第三方代码包就是其他用户开发

Linux下二进制包和源代码包的区分

主要提供三种格式的mysql包:rpm格式.二进制格式.源码格式:(tar打包,gz压缩) rpm格式: libjpeg-devel-6b-33.x86_64.rpm       #rpm格式很好区分, 二进制包: mysql-3.23.58-pc-linux-i686.tar.gz   #二进制格式的包名字很长,有版本号.适应平台.适应的硬件类型等,格式:mysql-<版本>-<OS>-tar.gz 源码包:    php-5.2.14.tar.gz              

变长随机函数发生器代码包

其实就是一个文件更新了,但是如果是发JAVA文件或者补丁,版本会混乱,我干脆直接上传整个代码包 还是StringRamdomTools.java文件更新了,把原来的固定长度的随机函数发生器改成变长随机函数发生器,在实时编译器中测试这个功能 大概只能够运行15分钟不到的时间,时序就出异常了,固定长度的函数发生器运行了5个小时都没有问题,不知道是什么原因? 至于计算的数值结果是否准确,我就没有认真去检测了,反正写这些代码是为了满足一下我们的好奇心吧....好玩而已.... 这个版本的随机函数发生器也

Linux下二进制包和源代码包

主要提供三种格式的mysql包:rpm格式.二进制格式.源码格式:(tar打包,gz压缩) rpm格式: libjpeg-devel-6b-33.x86_64.rpm       #rpm格式很好区分, 二进制包: mysql-3.23.58-pc-linux-i686.tar.gz   #二进制格式的包名字很长,有版本号.适应平台.适应的硬件类型等,格式:mysql-<版本>-<OS>-tar.gz 源码包:    php-5.2.14.tar.gz              

rpm管理环境包和代码包

Author: JinDate: 20140610System: CentOS release 6.5 (Final) 06-09-2014c零:问题配置文件问题,不打包使用的配置文件参考配置文件后缀.default 有个不替换操作 %config(noreplace) %{etcdir}/%{configfile} 新的安装为 /usr/local/redis/etc/redis.conf.rpmnew版本号更改: :%s/2.8.7/2.8.10/g 一般软件,游戏代码使用另外的 一.基本流

[PHP插件教程]002.代码包PHP Beautifier的使用

This program reformat and beautify PHP source code files automatically. The program is Open Source and distributed under the terms of PHP Licence. It is written in PHP 5 and has a command line tool. PHP Beautifier是一个用php编写的php代码美化工具. 框架详细的介绍地址:http:/

JWFD代码包开发过程说明

各位: JWFD的代码和工程包在实施的时候,并未与其它公司合作开发,完全是COMSCI自己独立的创作 引擎,算法,数据结构,矩阵这些关键模块都是COMSCI独立开发的成果,其它公司并未参与其中 JWFD开源项目并未和其它企业和公司发生过交易和并购的事件,其它公司也未派遣人员进入COMSCI系统 JWFD项目也未派遣人员进入其它公司合作工作,总之,JWFD开源项目是一个完全独立的私人开源项目 JWFD项目也并未向任何广告公司和媒体投放过广告和宣传题材,也未向外部派遣过任何宣传和技术人员 COMSC

【iOS开展-50】使用它来创建一个新的类的实现代码包,因此,不自觉地练习简单MVC实验,附带动画

接下来说说代码封装最后一个个案. 最后一种情况看:[iOS开展-48]九宫格案例:自己主动布局.字典转模型运用.id和instancetype差别.xib反复视图运用及与nib关系 (1)代码封装的原则是:要保证视图控制器尽量少的接触到其它对象的属性,也就是说,尽量把数据或者属性封装到一个类里面,然后利用类或者对象的方法来调用或者设置数据.而是赤裸裸地把属性都写在视图控制器中. 核心作用在于:降低视图控制器的代码量,把数据和属性的处理封装起来,这样也便于其它视图控制器的使用. 要做到的结果就是例