【问题标题】:Run Php Script contuniously on Background在后台连续运行 PHP 脚本
【发布时间】:2016-10-25 16:04:31
【问题描述】:

我已经编写了 server.php 以通过 tcp 套接字接受来自客户端的连接。 我用过

set_time_limit(0);
include_once("include/class.db.php");
while (true)
{
receive_message('x.x.x.x','8855',50);
}

function receive_message($ipServer,$portNumber,$nbSecondsIdle)
{
 // creating the socket...
 $socket = stream_socket_server('tcp://'.$ipServer.':'.$portNumber, $errno, $errstr);
if (!$socket)
{
echo "$errstr ($errno)<br />\n";
}
else
 {
// while there is connection, i'll receive it... if I didn't receive a message within $nbSecondsIdle seconds, the following function will stop.
while ($conn = @stream_socket_accept($socket,$nbSecondsIdle))
{
 $message= fread($conn, 1024);
 if($message!=''){
 echo 'I have received that : '.$message;
 // insert into database
 $sql = "insert into `data_log` (`id`,`message_text`) values (NULL,'$message')";
 $query=mysql_query($sql) or die(mysql_error() . "<br>" . $sql);
}
 fputs ($conn, "OK\n");
 fclose ($conn);
}
fclose($socket);
}
}

然后我运行

nohup php server.php >/dev/null 2>&1 &

在后台运行服务器。一切正常。但是套接字在几个小时后自动关闭,或者说 php 脚本在几个小时后结束。因为我需要在后台运行脚本,直到我手动停止它。 可能是什么问题? 提前致谢

【问题讨论】:

  • 好吧 - 您可以通过将程序输出管道传输到日志文件而不是 /dev/null 来开始故障排除。作为初步措施,您可以编写一个 cronjob 不时检查您的脚本是否仍在运行,如果没有,则重新启动它。
  • 可能在一段时间后数据库连接关闭并且脚本执行停止,或者您的内存不足。请首先检查您的连接。
  • @FranzGleichmann 使用文件而不是 /dev/null 在一天内创建了一个大约 20gb 的大文件。所以我使用 /dev/null
  • 然后消除所有不必要的输出,这样您就会得到错误消息。
  • @FranzGleichmann 我已将输出通过管道传输到日志文件,现在我将在脚本终止后返回日志报告。

标签: php sockets nohup


【解决方案1】:

您应该清楚地了解,php 不应该用于此类事情。 PHP脚本运行,做一些工作然后死掉——这就是它的命运。而且你在 php 上创建的任何恶魔都会因某种原因而死。

但是在 php 上创建恶魔非常容易。那么我们应该怎么做呢?

对于恶魔脚本,你应该实现 supervisor

首先,你有你的脚本,就像你上面描述的那样。有时为这个脚本实现一些中断条件是有用的,例如通过memory_get_usage进行进程内存限制

其次,你为你的恶魔实现主管脚本。那是什么东西?简单地说,一些脚本,你应该每 1 分钟从 cron 调用一次。该脚本将:

  1. 检查您的恶魔脚本是否仍在运行。当前通过 shell 运行的进程可用于此目的
  2. 如果您的恶魔已终止,请运行另一个实例。
  3. 退出

主管的概念非常有用。您可以在那里实现任何业务逻辑,例如运行确切数量的恶魔实例。对于像 RabbitMQ 消费者这样的脚本来说,它很棒。

【讨论】:

    【解决方案2】:

    您可以循环运行您的脚本,并提到sleep 时间使其休眠几秒钟。例如:

    while(1 < 2) {
        //your code
        sleep(1);
    }
    

    然后你可以使用nohup命令作为

    nohup php yourscript.php &
    

    这样它将在后台运行并检查它是否正在运行。使用top 命令查看后台进程,它将在顶级进程中以 php 的形式运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      相关资源
      最近更新 更多