2011-05-18 85 views
1

我正在从一个以未知间隔抽取数据的套接字获取数据。几分钟(甚至几小时)可能没有任何东西,然后成千上万的行可以排队等待阅读。PHP - 限制套接字连接期限

因为我不知道该期待什么,所以我希望能够在无论在服务器端排队多少的情况下,尽可能多地建立连接2-5秒的东西。

这是我目前所拥有的。

<?php 
set_time_limit(2); 
ini_set('max_input_time', 2); 

$timeout  = 3; 
$host   = 'data.host.com'; 
$port   = 6543; 
$fp   = fsockopen($host, $port, $errno, $errstr, $timeout); 
stream_set_timeout($fp, 2); 
if(!$fp){ 
    echo "Connection to '$host' failed.\n$errstr ($errno)\n"; 
    exit; 
} 

while(!feof($fp)){ 
    $xml = trim(fgets($fp)); 
    if(empty($xml)) continue; 
    echo "XML=$xml\n"; 
} 

echo "DONE\n"; 

function shutdown(){ 
    echo "SHUTDOWN!\n"; 
} 

register_shutdown_function('shutdown'); 

但是,这永远不会完成。 while循环看起来像人们可能期望的那样无限(不在上下文中)。我如何放入并捕获一些退出/中断/杀死?

回答

0

我相信这是一个mysql连接,如果是的话使用默认端口。除非您可以将所有事务存储在临时数据库中,并在分配时将其他事务推送到其他位置,否则不建议限制套接字连接。

1

这可能不是做的最好/正确的方法,但它应该工作(未经测试)

$startTime = time(); 
    $executionTime = 180; //180 Seconds - 2 Minutes 

    while(!feof($fp)){ 
     if ((time() - $startTime) > $executionTime) { 
      //If time has been longer than the execution time, break 
      //out of loop 
      break; 
     } 
     $xml = trim(fgets($fp)); 
     if(empty($xml)) continue; 
     echo "XML=$xml\n"; 
    } 
0
$start_time = time(); 
while(!feof($fp)){ 
    $xml = trim(fgets($fp)); 
    if(empty($xml)) continue; 
    echo "XML=$xml\n"; 
    if (time() - $star_time > 320) break; 
}