2011-05-18 87 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; 
}