php代码的原子部署

技术文档网 2021-04-16

php代码的原子部署

单单更新一个php文件,可以当成原子部署,但是同时更新多个php文件,就需要使用一些命令来帮助了,不能直接替换。

下面是一条常见的原子部署命令:

ln -s new tmp & mv -Tf tmp current

realpath的问题

使用ln实现原子部署会有一个问题,就是php本身会对路径进行缓存,就是说将相对路径到绝对路径的解析进行缓存。 当realpath的缓存还没有失效时(/current/->/old/),请求/current/index.php发给php-fpm的时候,/current/index.php会解析到/old/index.php。 这种情况在数据库或者其他外部资源也跟随新版本改变的时候,才会错误的问题,否则一般只是会出现部署延迟生效的问题。

这种延迟生效发生的频率与php进程的数量成正比。

解决方法

在nginx中,使用$realpath_root代替$document_root即可。这样nginx发送给php的不再是/current/index.php而是/new/index.php了。 并且这种并不会影响到php的realpath,因为require/include中通常都是使用相对路径,这种相对路径就能使用realpath缓存了。

realpath对于大量加载文件的框架性能提高比较多,因为这类框架通常包含了很多require/include。

共享资源的部署

单请求原子性

前面实现的原子部署,只是针对单个请求的原子部署,对于多个请求内的原子部署是没有效果的。比如一个页面中发送两条ajax请求,那么两条ajax可能访问的是两个版本的代码,如果这两份代码不能兼容,那么势必造成这个页面出错,这个时候需要用户自己刷新请求新的版本页面(在单页应用中很常见)。

共享资源

共享资源通常包括了数据库,静态资源等等。对于数据库,如果两个版本的代码不兼容的话(一般数据库都要设计成兼容),那么势必无法进行原子部署了。对于静态资源的话,通常是由浏览器的缓存造成不原子性,这个时候则可以给静态资源加上版本号。

如果共享资源的文件夹也在需要部署的文件里面,通常也将共享资源的文件放到外面,然后也使用软链接指向共享资源文件夹,比如用户上传的文件或者是public文件。

(未完待续)

相关文章

  1. 如何通过xhprof分析性能

    使用方法 xhprof_enable(); /** ... 要检查的php代码 ... **/ $xhprof_data = xhprof_disable(); // 引入xhprof_lib i

  2. LUMEN API Controller 规范

    1. 第三方依赖库规范 在使用LUMEN实现API接口时,以下库必须需要包含在composer包依赖中,以实现代码编写的一些规范 dingo/api : 实现API接口库 vlucas/phpdo

  3. PHP文件锁

    共享锁(LOCK_SH) 什么时候加共享锁? 当在读取数据的时候同时进行着其他的写操作,这个时候需要对文件加共享锁,否则无论有没有对写操作加写锁都会写入成功,导致数据不一致 当文件获得共享锁时,其他

  4. Hello-Risen-程序

    首先需要说明的是,您下载到的文件包含两部分,其中src中是开发源码,用于对Risen框架本身的开发,risen 目录中是通过源码生成的包含debug和release版本的框架程序,用于您应用程序的开发

  5. PHP自定义类示例(Weixin消息解析类)

    PHP自定义类示例(Weixin消息解析类) /** * Created by Qingger. * User: jsspf * Date: 2017/3/24 * Time: 10:50

随机推荐

  1. 如何通过xhprof分析性能

    使用方法 xhprof_enable(); /** ... 要检查的php代码 ... **/ $xhprof_data = xhprof_disable(); // 引入xhprof_lib i

  2. LUMEN API Controller 规范

    1. 第三方依赖库规范 在使用LUMEN实现API接口时,以下库必须需要包含在composer包依赖中,以实现代码编写的一些规范 dingo/api : 实现API接口库 vlucas/phpdo

  3. PHP文件锁

    共享锁(LOCK_SH) 什么时候加共享锁? 当在读取数据的时候同时进行着其他的写操作,这个时候需要对文件加共享锁,否则无论有没有对写操作加写锁都会写入成功,导致数据不一致 当文件获得共享锁时,其他

  4. Hello-Risen-程序

    首先需要说明的是,您下载到的文件包含两部分,其中src中是开发源码,用于对Risen框架本身的开发,risen 目录中是通过源码生成的包含debug和release版本的框架程序,用于您应用程序的开发

  5. PHP自定义类示例(Weixin消息解析类)

    PHP自定义类示例(Weixin消息解析类) /** * Created by Qingger. * User: jsspf * Date: 2017/3/24 * Time: 10:50