惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
Y
Y Combinator Blog
博客园 - Franky
D
Docker
B
Blog RSS Feed
M
MIT News - Artificial intelligence
雷峰网
雷峰网
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
S
SegmentFault 最新的问题
GbyAI
GbyAI
Recent Announcements
Recent Announcements
Martin Fowler
Martin Fowler
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
B
Blog
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
Vercel News
Vercel News
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News

SegmentFault 程序员就要好好玩最新的文章

亚马逊的技术哲学 11月初的美国之旅 -- 参加微软的 Microsoft Ignite 2019 JavaScript 初学者教程(指南) 如何学习一门新的语言 思路清奇:通过 JavaScript 获取移动设备的型号 一些关于Logecho的新动态 利用dns解析来实现网站的负载均衡 服务器被sfewfesfs病毒攻击 从一些小白问题想到的 Ruby学习第一天 从如何获取可信赖的ip地址聊起 新版 SegmentFault 重构之系统架构 一个用于web开发的泛域名 如何优雅地连接ssh 我是如何看简历的 靠谱的前端工程师在哪里 PHP 5.6新特性之一:内部操作符重载 怎么样使用 Redis 来存储和查询 ip 数据 邮件发送服务AWS SES,Mailgun以及SendCloud 用PHP实现一个Amazon SES的代理服务器 在MySQL字段中使用逗号分隔符
使用phar上线你的代码包
joyqi · 2014-11-19 · via SegmentFault 程序员就要好好玩最新的文章

在我前一阵子写的一篇文章《新版 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这个文件了,它展示了一个经过简化的打包过程,实际上,稍加修改它就能用在你的项目中,这个文件的代码注释很详细,我就不重复说明了,现在我们在终端下运行它

phar1

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

phar2

看来成功了,而且当前目录下已经有了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),几乎对性能没有影响。