php - 在 Linux 服务器后台运行 PHP 文件以获取推送通知

标签 php linux process

我正在尝试在 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/

相关文章:

php - 提高 `Update` 性能(行锁定问题)

linux - 启动 Tomcat

linux - 仅基于控制台的服务器上的 X Windows Server 系统

c++ - 如何在 Linux 中监视子进程状态

process - Golang 写入输入并从终端进程获取输出

php - 我需要 libphp7.so 模块来在 Centos 上配置 apache

php - 类的大型配置,实现建议

php - 我如何在 PHP 中遍历 DOM 元素?

php - 来自 php 的 dump-autoload 命令

c - 使用 fork 和 exec 启动进程,同时将 stdout 重定向到/dev/null