2016-10-25 27 views
1

我写了server.php来接受客户端通过tcp套接字的连接。 和我有使用在背景上连续运行Php脚本

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脚本在几个小时后结束。因为我的需要是在后台运行脚本,直到我手动停止它。 可能是什么问题? 在此先感谢

+0

好吧 - 您可以开始排除故障,将您的程序输出管道输出到日志文件而不是/ dev/null。作为一个初步措施,如果你的脚本仍在运行,你可以不时地写一个cronjob检查,如果不是的话,重新启动它。 –

+0

可能经过一段时间db连接被关闭,脚本执行停止,或者你的内存不足。请首先检查您的连接。 –

+0

@FranzGleichmann使用文件而不是/ dev/null在一天内创建一个大约20GB的大文件。所以我使用/ dev/null –

回答

0

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

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

然后你可以使用nohup命令

nohup php yourscript.php & 

因此,它会在后台运行,并检查它的运行。使用top命令来查看将在顶级进程中运行命令为php的后台进程。

1

你应该明白,比php不应该被用于这样的事情。 PHP脚本运行,做了一些工作,并死亡 - 这是它的命运。任何你在php上创建的恶魔都会因为某些原因而死亡。

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

对于恶魔脚本,您应该执行主管

首先,你有你的脚本,就像你上面描述的那样。有时候为这个脚本实现一些中断条件很有用,比如通过memory_get_usage

通过memory_get_usage来限制进程内存限制。其次,你为你的恶魔实现主管脚本。那个东西是什么?简单地说,你应该每隔1分钟从cron中调用一些脚本。此脚本将:

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

主管的概念是非常有用的。您可以在那里实施任何业务逻辑,例如运行精确数量的恶魔实例。它非常适合像RabbitMQ消费者这样的脚本。