我正在尝试在 Linux 服务器的后台执行一个 PHP 文件,使用在博客上找到的一个很酷的脚本:
NAME=servicename
DESC="Daemon for my magnificent PHP CLI script"
DAEMON="/usr/bin/php"
DAEMON_OPTS="/var/www/html/phpscript.php"
test -x $DAEMON || exit 0
set -e
case "$1" in
start)
echo -n "Starting ${DESC}: "
nohup php $DAEMON_OPTS &
;;
stop)
ps faux | grep php
echo -n "Can't Stop process, use kill -9 pid"
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop}" >&2
exit 1
;;
esac
exit 0
我在/etc/init.d/中创建了 shell 脚本
执行
chmod +x phpscript.php
...和
update-rc.d servicename defaults
命令,但是在通过
启动脚本之后/etc/init.d/servicename start
...,服务在一段时间后停止。我不知道为什么。
这里,phpscript:
[...]
function start(){
while (1) {
[...]
if (mysqli_num_rows($result) > 0) {
$this->checkAPNS();
if ($this->fp) {
while ($data = mysqli_fetch_array($result)) {
$token = $data[0];
$payload = $data[1];
$sendPush = sendPush($this->fp, $token, $payload);
if (!$sendPush) {
$retry = 0;
while (1) {
if ($this->reconnectToAPNS()) {
return;
}
if ($retry++ > 3) {
file_put_contents("push.log", "Error at ".msTimeStamp()."\n", FILE_APPEND | LOCK_EX);
sleep(10);
return;
}
}
}
[...]
}
}
usleep(500000);
}
}
}
[...]
我怎样才能让这个进程继续运行?
最佳答案
终止进程的发生可能有无穷无尽的原因。任何未捕获的未处理异常或运行时错误都将导致您的进程退出。如果您的 mysql 连接已打开一段时间,那么每当您尝试查询数据库时,您都会收到可怕的“MySQL 服务器已消失”错误。
如果您不小心分配资源,那么一段时间后您可能会填满机器上的所有可用内存并导致 PHP 发出“Allowed memory size of x bytes exhausted”
根据您的操作系统,您可以将 PHP 设置为将命令行环境中的错误输出到特定的日志文件。听起来您不太确定到底是什么问题,所以这应该是您的第一步。 Find the php.ini file由命令行 PHP 加载然后找到 error_log
的配置设置并检查引用的文件以确定脚本终止的原因。如果您希望此特定脚本在其他地方记录错误,您还应该能够通过 ini_set()
更新它。
作为后备补救措施,您可以使用进程管理软件,例如 supervisord作为监视特定进程的服务运行。如果它们出于任何原因退出或退出,则主管将使用可配置参数自动重新启动它们。
最后一点,您应该确保在可能抛出异常的地方包含 try/catch
block 。我在您的缩写代码中没有看到任何内容,因此它们可能已经存在,只是您没有共享。未处理的异常将终止您的脚本,因此我总是至少在最外层范围内包含try/catch
,以确保捕获所有异常。
关于php - 在 Linux 服务器后台运行 PHP 文件以获取推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32761412/