小故事:我可以composer update
在运行的站点上运行而不必担心首先更新哪些依赖项吗?
更长的故事:我试图弄清楚 composer 的实际更新过程是否是原子的。
当所有内容都下载并检查OK时,依赖项是否一次更新/激活,或者每个依赖项在下载后立即更新?如果一个更新在中间失败了怎么办?
找不到相关的文档,所以我希望有人能帮忙!如果记录在案,我会很高兴有一个链接。
小故事:我可以composer update
在运行的站点上运行而不必担心首先更新哪些依赖项吗?
更长的故事:我试图弄清楚 composer 的实际更新过程是否是原子的。
当所有内容都下载并检查OK时,依赖项是否一次更新/激活,或者每个依赖项在下载后立即更新?如果一个更新在中间失败了怎么办?
找不到相关的文档,所以我希望有人能帮忙!如果记录在案,我会很高兴有一个链接。
不,composer update
也不composer install
是原子的。
对于每个依赖项composer update
将:
如果下载因任何原因(例如配额限制、连接失败等)失败,则应用程序将处于无法运行的状态。
一种解决方案是将供应商文件夹和作曲家文件复制到新目录中,运行composer update
或composer install
在此目录中,然后将旧供应商目录切换为新目录。
即使这个解决方案更快,它也不是原子的,并且可以/将导致失败的请求。确实: - 切换两个目录不能是原子的 - 由于 PHP 应用程序分布在多个文件中,请求可以从旧版本的文件开始,然后包含新版本,这可能会导致未定义的行为。
但是,这对于大多数 Web 应用程序来说是可以接受的。
唯一的解决方案是复制整个应用程序,对其进行更新,然后更改您的 Web 服务器配置以使用更新后的应用程序。Web 服务器可以以原子方式重新加载其配置。
这个解决方案并不完全是原子的,因为一些用户将使用旧版本完成他们的请求,而其他一些用户将使用新版本开始一个新请求。在短时间内,应用程序的两个版本将共存。
第三种解决方案是使用第一种解决方案,并告诉您的 Web 服务器在短暂的停机时间内堆叠请求。
这意味着: - 告诉您的 Web 服务器堆叠连接 - 等待现有请求完成(< 200 毫秒) - 切换应用程序目录(< 10 毫秒) - 实现堆叠连接
停机期间的请求将延迟约 200 毫秒,这在大多数情况下是可以接受的。
您可以在此处找到有关堆叠请求的更多信息:https ://serverfault.com/questions/654780/how-to-suspend-nginx-requests-during-backend-upgrades
我不知道它是否是原子的,但是,如果出现故障,作曲家通常会知道是什么。所以你至少可以验证。
还有:
composer update --dry-run
但是你永远不能在一个正在运行composer update
的站点上运行。您需要停止站点,进行更新,然后重新启动站点。