我从一个以未知间隔泵送数据的套接字中获取数据。几分钟(甚至几小时)可能没有任何内容,然后成千上万的行可以排队等待阅读。
因为我不知道会发生什么,所以我希望能够构建一些连接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 :(得分: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";
}
答案 1 :(得分:0)
我相信这是一个mysql连接,如果是这样,请使用默认端口。除非您可以将所有事务存储在临时数据库中并在分配时将其推送到其他地方,否则不建议限制套接字连接。
答案 2 :(得分: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;
}