PHP - ограничение периода подключения сокетов - PullRequest
1 голос
/ 18 мая 2011

Я получаю данные из сокета, который качает данные с неизвестными интервалами.В течение нескольких минут (или даже часов) может не быть ничего, и тогда десятки тысяч строк могут быть поставлены в очередь для чтения.

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

Ответы [ 3 ]

1 голос
/ 18 мая 2011

Возможно, это не лучший / правильный способ сделать это, но он должен работать (не проверено)

    $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 голосов
/ 18 мая 2011
$start_time = time();
while( !feof($fp) ){
  $xml = trim(fgets($fp));
  if(empty($xml)) continue;
  echo "XML=$xml\n";
  if ( time() - $star_time > 320 ) break;
}
0 голосов
/ 18 мая 2011

Я считаю, что это соединение MySQL, если так, используйте порт по умолчанию. Ограничение сокетного соединения не рекомендуется, если вы не можете сохранить все транзакции в базе данных temp db и нажать еще где-то в назначенное время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...