我试图在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
我创建了shell脚本到/etc/init.d/
执行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 server has gone away"错误。
如果你不小心分配资源,那么一段时间后,你可能会填满机器上所有可用的内存,并导致PHP发出"允许的内存大小x字节耗尽"
根据您的操作系统,您可以将PHP设置为从命令行环境输出错误到特定的日志文件。听起来你好像不太确定问题到底是什么,所以这应该是你的第一步。找到PHP命令行加载的PHP .ini文件,然后找到error_log
的配置设置,并检查所引用的文件,以确定脚本终止的原因。如果你希望这个特定的脚本在其他地方记录错误,你也应该能够通过ini_set()
来更新这个。
作为后备补救措施,您可以使用进程管理软件,例如作为服务运行的监督特定进程的监理软件。如果他们退出或退出任何原因,那么监控器将自动重启他们与可配置的参数。
最后一点,您应该确保在可能抛出异常的地方包含try/catch
块。我在你的缩写代码中没有看到,所以它们可能已经在那里了,只是你没有分享。未处理的异常将终止您的脚本,所以我总是在最外层作用域中至少包含try/catch
,以确保捕获所有异常。