Php 如何避免我的脚本冻结
我有一个socket服务器脚本,它持续运行,监听在PHP CLI中运行的GPS设备,我的问题是,如果长时间执行,我的socket将冻结,如何防止脚本冻结。我不知道这个套接字。这是我第一次使用套接字连接。我创建了一个变量来检查它是否会延迟到5分钟,然后我中断循环并重新开始。我不知道这是否是处理此问题或防止冻结的正确方法 我很感激有人能帮我解决问题 我更新了我的代码Php 如何避免我的脚本冻结,php,sockets,Php,Sockets,我有一个socket服务器脚本,它持续运行,监听在PHP CLI中运行的GPS设备,我的问题是,如果长时间执行,我的socket将冻结,如何防止脚本冻结。我不知道这个套接字。这是我第一次使用套接字连接。我创建了一个变量来检查它是否会延迟到5分钟,然后我中断循环并重新开始。我不知道这是否是处理此问题或防止冻结的正确方法 我很感激有人能帮我解决问题 我更新了我的代码 <?php error_reporting(-1); ini_set('display_errors', 1); set
<?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);
}
?>
提前谢谢。从我在您的问题中包含的代码中看到的情况来看,您永远不会更改
$done
的值,因此您的while循环将永远运行
因此,当您通过调用实现了所需的功能时,要做的是将$done
的值更改为false。例如,在fwrite()之后,您可以编写:
$done = false;
为什么代码中需要这么多空行?@Lashane,代码中的空行是什么意思?换行符,如果你删除它们,整个代码都会被看到scrolling@Lashane,您的意思是“\r\n”?我的意思是-由于无用的换行符,您的代码看起来非常稀疏,是-在某些系统中,换行意味着
\r\n
在某些系统中,您的新代码是错误的。您将变量定义为$TIME\u TO\u EXIT,但在不使用$的情况下调用is TIME\u TO\u EXIT。一般来说,人们不会这样命名变量(大写字母)。这是为常数做的。最后,在socketfunction()中,您没有定义所有应该接受的参数。