PHP-FPM (7.4.2) 不会优雅地停止?

在更新期间,我们希望停止 php-fpm 并等待所有正在运行的脚本完成,然后再进行任何文件更改。


我们发现我们需要设置process_control_timeout,所以我们在“/etc/php/7.4/fpm/pool.d/zz-00-overrides.ini”中放置了“process_control_timeout = 36000s”(我们重新启动了php-fpm)。


然后我们创建了一个测试脚本来测试它。我们的测试脚本会创建一个文件,然后 30 秒后,它会创建另一个文件。剧本:


$id = random_int(10000, 99999);

file_put_contents(__DIR__ . '/' . $id . '-start', '');

sleep(30);

file_put_contents(__DIR__ . '/' . $id . '-end', '');

当我们正常运行脚本时(浏览器 -> nginx -> php-fpm),它会创建第一个文件,30 秒后它会创建第二个文件。

当我们运行脚本时,等待几秒钟,然后尝试停止它(运行方式和之前一样:浏览器 -> nginx -> php-fpm)(停止方式:“service php7.4-fpm stop”),它将创建第一个文件,然后运行服务停止命令,只需要 2-3 秒,然后浏览器显示“502 Bad Gateway”,然后永远不会创建第二个文件。

它不会优雅地停止。我们想要的结果是“service php7.4-fpm stop”等待所有脚本完成,然后停止,而不是像现在这样为了强制停止而杀死任何正在运行的脚本。

我们错过了什么,我们做错了什么吗?它是某种地方的错误吗?任何帮助将非常感激。

  • Debian 10 (Linux 4.19.0-6-cloud-amd64 #1 SMP Debian 4.19.67-2+deb10u2 (2019-11-11) x86_64 GNU/Linux)

  • PHP 7.4.2

  • Nginx 1.14.2



慕森王
浏览 148回答 1
1回答

心有法竹

运行kill -QUIT $(cat /run/php/php7.4-fpm.pid)确实考虑了process_control_timeout配置。一旦所有脚本完成执行,它将导致 PHP-FPM 进程停止。此时,PID 将被删除。因此,为了使其工作:跑$(kill -QUIT $(cat /run/php/php7.4-fpm.pid))在一个循环中,检查是否/run/php/php7.4-fpm.pid仍然存在,如果不存在,则中断循环。
打开App,查看更多内容
随时随地看视频慕课网APP