资讯专栏INFORMATION COLUMN

使用phar上线你的代码包

MangoGoing / 3489人阅读

摘要:在我前一阵子写的一篇文章新版重构之系统架构中,很多人对其中提到的利用上线代码比较感兴趣,我就在这边跟大家分享下我目前的做法。现有代码需要做何处理吗如果你的代码结构比较科学比如采用大部分框架的推荐结构,那么一行都不需要改变。

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

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

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

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

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

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

在项目里用include或者require来引用其他项目内文件时,最好不要直接用相对地址,而是在前面加上__DIR__常量

因为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://www.ucloud.cn/yun/20862.html

相关文章

  • [转] composer - 文档 - 命令行

    摘要:模拟命令,并没有做实际的操作。申明依赖命令增加新的依赖包到当前目录的文件中。你甚至可以输入一个软件包的版本号,来显示该版本的详细信息。你也可以在第三个参数中指定版本号,否则将获取最新的版本。 原文地址 : composer 命令行 全局参数 下列参数可与每一个命令结合使用: --verbose (-v): 增加反馈信息的详细度。 -v 表示正常输出。 -vv 表示更详细的输出。 ...

    mj 评论0 收藏0
  • php-composer的安装与使用方法(简化版)

    摘要:中文网系统要求运行需要以上版本。注中的路径为相对于的路径这个时候,你就可以调用你自己编写的函数库或者类库了注本文内容参考了中文网,后续还会更新其它的实用功能 1.简介 Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。《Composer 中文网》 2.系统要求 运行 Composer 需要 PHP 5.3.2+ 以上版本。C...

    mikasa 评论0 收藏0
  • Composer 简介

    摘要:默认情况下它不会在全局安装任何东西。这种想法并不新鲜,受到了和的强烈启发。其中一些库依赖于其他库。系统要求运行需要以上版本。一些敏感的设置和编译标志也是必须的,但对于任何不兼容项安装程序都会抛出警告。这是的二进制文件。 Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。 1. 依赖管理 Composer 不是一个包管理器...

    Code4App 评论0 收藏0
  • 一个更加容和宽泛的Composer

    摘要:一个聪明的指挥家。是个很贴心的家伙。和的目的差不多。上面原因不是全部,而且谨慎守规矩渠道限制也未必是坏事,但是它的确影响了的发展,而更加具有冒险精神更加包容和灵活。来了年,就是发布年后的一天,及提出工具并发布第一个版本。如果是和会简单的多。 一个聪明的指挥家。 明日北哥 sf社区直播 composer课程,感兴趣的记得来看哦 https://segmentfault.com/l/15....

    张春雷 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<