如何避免我的脚本冻结

时间:2014-08-20 04:14:53

标签: php sockets

我有持续运行的套接字服务器脚本监听在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);
}


?>

提前谢谢。

1 个答案:

答案 0 :(得分:-1)

从我在您的问题中包含的代码中看到的内容,您永远不会更改$done的值,因此您的while循环将永远运行。

所以,当你通过电话达到你想要的效果时,可以将$done的值更改为false。所以例如在fwrite()之后写下:

$done = false;