在背景

时间:2016-10-25 16:04:32

标签: php sockets nohup

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

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脚本就会结束。因为我需要在后台运行脚本,直到我手动停止它。 可能是什么问题? 提前致谢

2 个答案:

答案 0 :(得分:1)

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

但是在php上创建恶魔很容易。那我们该怎么办?

对于恶魔脚本,您应该实现主管

首先,您有自己的脚本,就像上面描述的那样。有时,为此脚本实现一些中断条件很有用,例如通过memory_get_usage

进程内存限制

其次,您为恶魔实施了主管脚本。那是什么东西?简单来说,一些脚本,你应该每隔1分钟从cron调用一次。这个脚本将:

  1. 检查恶魔脚本是否仍在运行。目前通过shell运行的进程可用于此目的
  2. 如果恶魔已经终止,请运行另一个实例。
  3. 退出
  4. 主管的概念非常有用。您可以在那里实现任何业务逻辑,例如运行确切数量的恶魔实例。它非常适合像RabbitMQ消费者这样的脚本。

答案 1 :(得分:0)

您可以在循环中运行脚本并提及sleep次,让它睡几秒钟。例如:

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

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

nohup php yourscript.php &

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