PHP 代码更新的时候会不会中断用户正在进行的请求及响应

2019-09-19 17:59:22 +08:00
 awanganddong

php 模式是使用的 php-fpm 模式

比如用户正在请求响应,这时候我更新了代码。会不会对正在请求响应产生影响

问了我老大,他说不会。 让我了解 web 的工作原理

这里我就想问下,大家 这个没想明白

6441 次点击
所在节点    PHP
28 条回复
lihongming
2019-09-20 01:03:32 +08:00
你要是一个文件一个文件的更新,难免会出现用户访问的文件一部分新一部分旧的问题。要是还改了数据库,那就不可避免会出错。

所以我们都是把 PHP 等后端系统放在容器或虚拟机里,一更新就是整个系统,然后在前端 nginx 切换一下就行了。
ladypxy
2019-09-20 06:30:02 +08:00
这么久了居然都没人提到 opcache.revalidate_freq。这就专门针对更新的设置
awanganddong
2019-09-20 09:26:55 +08:00
现在已经知道对于我提到的问题的解决方案有两种,
一种是 nginx 进行切换
一种是 ci 的自动发布
lihongjie0209
2019-09-20 10:28:39 +08:00
情况有很多, 简单来讲: 不会

用户正在进行的请求就意味着 php 代码已经被加载的内存中执行了(进程), 这个时候你更新程序, 是不会影响到进程的。


复杂点讲, 可能会:
用户正在进行的请求就意味着 php 代码已经被加载的内存中执行了(进程),这个进程然后去加载其他的代码, 而你在更新其他代码, 那么就会可能导致一些问题, 如:

1. 代码不兼容, 原来是方法 A, 现在改为方法 B, 当然会报错
2. 代码不完整, 取决于你的更新方式, 当前你的文件数据可能是不完整的, 比如说 1K 的文件当前只传输了 0.5K , 这时候你去读取文件, 就会直接报错。


这个问题其实和 PHP 没什么关系, 更多是操作系统中进程和文件系统的一些相关知识。
ETO
2019-09-20 11:19:38 +08:00
@lp7631010 道理一样的。
laminux29
2019-09-20 11:44:22 +08:00
不管会不会,你这种做法就是不对的。正确的操作应该像 9 楼 [CODEWEA] 说的那样。

这种事情的本质是事务问题,你想了解详情的话,可以翻翻数据库、分布式系统的书籍,里面会有关于这个问题的阐述。
awanganddong
2019-09-20 14:05:10 +08:00
@lihongjie0209 对的,实际上公司代码是通过 jenkins 全量覆盖。然后更新过程中,出现不正常,继而引发对这个问题的探讨。

这个问题,也确实不单单 php 会遇到,包括其他中语言也是一样,可能方式不一样。
lihongjie0209
2019-09-20 14:40:55 +08:00
@awanganddong #27 如果做不到多节点负载, 一个节点一个节点的更新, 那最好就是先把 Nginx 关闭再更新

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/602265

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX