Я получаю данные из сокета, который качает данные с неизвестными интервалами.В течение нескольких минут (или даже часов) может не быть ничего, и тогда десятки тысяч строк могут быть поставлены в очередь для чтения.
Поскольку я не знаю, чего ожидать, я надеялся создать что-то, что соединитОт 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 кажется таким же бесконечным, как и следовало ожидать (вне контекста).Как мне вставить и захватить выход / сломать / убить?