经过一段时间的苦苦奋斗,我相信我发现了魔法配置设置,使得子进程在死机之前完成处理请求.
process_control_timeout
Time limit for child processes to wait for a reaction on signals from master
基本上,通过将其设置为10s,子进程将等待这么长时间,同时在退出之前处理现有请求.
不幸的是,似乎php-fpm主进程立即退出,所以,由代码here启发,我写了一个包装脚本:
#!/bin/bash
PHP_FPM_PID='/php-fpm.pid'
wait_for_pid () {
try=0
while test $try -lt 35 ; do
if [ ! -f "$1" ] ; then
try=''
break
fi
echo -n .
try=`expr $try + 1`
sleep 1
done
}
function clean_up {
echo "Killing $(cat $PHP_FPM_PID)"
kill -QUIT `cat $PHP_FPM_PID`
wait_for_pid $PHP_FPM_PID
echo "Done!"
exit 0
}
trap clean_up EXIT
nohup php-fpm --daemonize --pid $PHP_FPM_PID 2>&1 &
while true; do sleep 1; done
# ^ do nothing forever
它等待35秒或直到该pid文件被删除(大概是由其中一个子进程?我还不清楚它是如何被删除的).
无论如何,这个包装脚本与我们正在使用Kubernetes的php-fpm docker容器的CMD一样很好.