作曲家更新是原子的吗?

Eir*_*oem 6 php composer-php

简短的故事:我可以composer update在运行的站点上运行而不必担心首先更新哪些依赖项吗?

更长的故事:我试图弄清楚使用composer的实际更新过程是否是原子的.

是否一次更新/激活依赖项,一切都下载并检查好,或者每次下载后都会更新依赖项?如果一次更新在中间失败怎么办?

无法找到文档,所以我希望有人可以帮忙!如果记录在案,我会很满意那里的链接.

Con*_*501 5

不,composer update并且composer install不是原子的。

对于每个依赖项composer update将:

  • 删除过时的依赖项(让您的应用程序处于非工作状态)
  • 下载新的依赖项(当应用程序仍然损坏时)
  • 安装新版本

如果下载因任何原因(例如配额限制、连接失败等)失败,则应用程序将处于无法运行的状态。

更好的解决方案(易于设置,不是原子性的,停机时间很短)

一种解决方案是将供应商文件夹和作曲家文件复制到新目录中,运行composer updatecomposer install在此目录中,然后将旧供应商目录切换为新目录。

即使这个解决方案要快得多,它也不是原子的,可以/将导致请求失败。确实: - 切换两个目录不能是原子的 - 由于 PHP 应用程序分布在多个文件中,请求可以从旧版本的文件开始,然后包含新版本,这可能会导致未定义的行为。

但是,这对于大多数 Web 应用程序来说是可以接受的。

解决方案 2 - 启动第二个实例(非原子,无停机时间)

唯一的解决方案是复制完整的应用程序,更新它,然后更改您的 Web 服务器配置以使用更新的应用程序。Web 服务器可以以原子方式重新加载其配置。

这个解决方案并不完全是原子的,因为一些用户将使用旧版本完成他们的请求,而其他一些用户将使用新版本开始一个新请求。在短时间内,应用程序的两个版本将共存。

方案三——栈连接(原子,小延迟)

第三种解决方案是使用第一种解决方案并告诉您的 Web 服务器在短暂停机期间堆叠请求。

这意味着: - 告诉您的 Web 服务器堆叠连接 - 等待现有请求完成(< 200 毫秒) - 切换应用程序目录(< 10 毫秒) - 实现堆叠连接

停机期间的请求将延迟约 200 毫秒,这在大多数情况下是可以接受的。

您可以在此处找到有关堆叠请求的更多信息:https : //serverfault.com/questions/654780/how-to-suspend-nginx-requests-during-backend-upgrades