6

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

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

当所有内容都下载并检查OK时,依赖项是否一次更新/激活,或者每个依赖项在下载后立即更新?如果一个更新在中间失败了怎么办?

找不到相关的文档,所以我希望有人能帮忙!如果记录在案,我会很高兴有一个链接。

4

2 回答 2

5

不,composer update也不composer install是原子的。

对于每个依赖项composer update将:

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

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

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

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

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

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

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

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

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

解决方案 3 - 堆栈连接(原子,小延迟)

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

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

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

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

于 2015-12-18T14:13:24.227 回答
2

我不知道它是否是原子的,但是,如果出现故障,作曲家通常会知道是什么。所以你至少可以验证。

还有:

composer update --dry-run

但是你永远不能在一个正在运行composer update的站点上运行。您需要停止站点,进行更新,然后重新启动站点。

于 2013-04-10T13:36:42.453 回答