我有持续运行的套接字服务器脚本监听在PHP CLI中运行的GPS设备,我的问题是如果执行很长时间我的套接字会冻结,如何防止这种情况,以便我的脚本不会冻结.I我不知道这个socket。这是我第一次使用套接字连接。我创建了变量来检查它是否经过了5分钟,然后我打破了循环并重新启动它。我不知道这是不是正确处理这个或防止冻结。
我感谢有人可以帮我解决问题。
我更新了我的代码
<?php
error_reporting(-1);
ini_set('display_errors', 1);
set_time_limit (0);
for(;;){
$FIVE_MINUTES = 300000000;
$TIME_TO_EXIT = 0;
$address_server = 'xxx.xxx.xx.xx';
$port_server = xxxx;
$isTrue = true;
socketfunction($address_server,$port_server,$isTrue,$TIME_TO_EXIT, $FIVE_MINUTES);
}
function socketfunction($address,$port,$done){
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sock, $address, $port);
socket_listen($sock);
$clients = array($sock);
while ($done ) {
$file = fopen('txt.log','a');
$read = $clients;
$write = NULL;
$except = NULL;
$tv_sec = 0;
$TIME_TO_EXIT++;
if(TIME_TO_EXIT>$FIVE_MINUTES){
$done =false;
break 2;//exit while loop
}
if (socket_select($read, $write , $except, $tv_sec) < 1){
continue;
}
// checking client
if (in_array($sock, $read)) {
$clients[] = $newsock = socket_accept($sock);
$key = array_search($sock, $read);
unset($read[$key]);
}
//handle client for reading
foreach ($read as $read_sock) {
$data = @socket_read($read_sock, 1024, PHP_NORMAL_READ);
if ($data === false) {
$key = array_search($read_sock, $clients);
unset($clients[$key]);
echo "client disconnected.\n";
echo "Remaining ".(count($clients) - 1)."client(s) connected\r\n";
continue;
}
$data = trim($data);
if (!empty($data)) {
echo("Returning stripped input\n");
fwrite($file,$data."\n");
}
} // end of reading foreach
fclose($file);
}//end while
socket_close($sock);
}
?>
提前谢谢。
答案 0 :(得分:-1)
从我在您的问题中包含的代码中看到的内容,您永远不会更改$done
的值,因此您的while循环将永远运行。
所以,当你通过电话达到你想要的效果时,可以将$done
的值更改为false。所以例如在fwrite()之后写下:
$done = false;