Я использую приведенный ниже скрипт для подключения к внешнему АТС-серверу и получения журналов вызовов.
Однако он возвращает только 1 строчку за раз, что равно 1 log. Поэтому мне нужно обновить несколько раз, чтобы получить все доступные журналы.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die();
$result = socket_connect($socket, $address, $port) or die();
$out = socket_read($socket, 2048);
Как получить все доступные строки без необходимости постоянно инициализировать соединение?
Возможно, вы имеете в виду чтение из сокета в цикле?
Согласно документации (http://php.net/socket_read) вы можете сделать что-то подобное while ($portion = socket_read($socket, 2048)) { do_something_with_that_portion_of_log; }
и если данные исчерпаны, вы получите пустую строку или FALSE, если произошла ошибка.
ОКОНЧАТЕЛЬНОЕ РЕШЕНИЕ
Мы используем socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=> 10, 'usec'=> 0));
с режимом неблокирования по умолчанию. После того, как все журналы будут прочитаны, программа будет ждать ~ 10 секунд и заканчивать.
https://gist.github.com/mihalicyn/533273e0d8b23de33aaf7f2cf0973d88
Других решений пока нет …