Php 如何避免我的脚本冻结

Php 如何避免我的脚本冻结,php,sockets,Php,Sockets,我有一个socket服务器脚本,它持续运行,监听在PHP CLI中运行的GPS设备,我的问题是,如果长时间执行,我的socket将冻结,如何防止脚本冻结。我不知道这个套接字。这是我第一次使用套接字连接。我创建了一个变量来检查它是否会延迟到5分钟,然后我中断循环并重新开始。我不知道这是否是处理此问题或防止冻结的正确方法 我很感激有人能帮我解决问题 我更新了我的代码 <?php error_reporting(-1); ini_set('display_errors', 1); set

我有一个socket服务器脚本,它持续运行,监听在PHP CLI中运行的GPS设备,我的问题是,如果长时间执行,我的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);
}


?>


提前谢谢。

从我在您的问题中包含的代码中看到的情况来看,您永远不会更改
$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()中,您没有定义所有应该接受的参数。