在Linux服务器后台运行PHP文件进行推送通知


Run PHP file in background of Linux server for Push notifications

我试图在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,以确保捕获所有异常。