Как бороться с потоковой передачей данных в PHP?
Вопрос
Существует семейство методов ( birddog, shadow и follow ) в Twitter API, который открывает (в основном) постоянное соединение и позволяет вам следить за многими пользователями. Я запустил пример кода подключения с помощью cURL в bash, и он прекрасно работает: когда указанный пользователем пользователь пишет твит, я получаю поток XML в своей консоли.
У меня вопрос: как я могу получить доступ к данным с помощью PHP, которые не возвращаются как прямой вызов функции, но передаются в потоковом режиме? Эти данные поступают время от времени и непредсказуемо, и это не то, что я когда-либо имел дело с, и я не знаю, с чего начать искать ответы. Любые советы и описания библиотек или подводных камней будут оценены.
Решение
<?php
$sock = fopen('http://domain.tld/path/to/file', 'r');
$data = null;
while(($data = fgets($sock)) == TRUE)
{
echo $data;
}
fclose($sock);
Это ни в коем случае не отличный (или даже хороший) код, но он должен обеспечивать необходимую вам функциональность. Вам нужно будет добавить обработку ошибок и анализ данных между прочим.
Другие советы
Я почти уверен, что ваш сценарий будет отключен через ~ 30 секунд прослушивания данных в потоке. Даже если этого не произойдет, как только вы получите значительную нагрузку на сервер, огромное количество открытых и прослушивающих соединений поставит сервер на колени.
Я бы посоветовал вам взглянуть на решение AJAX, которое выполняет вызов сценария, который просто хранит очередь сообщений. Хотя я не уверен, как именно API Twitter работает, поэтому я не уверен, можно ли запустить скрипт при запросе на получение всех твитов, или вам нужно, чтобы какой-то демон добавлял твиты в очередь что PHP может читать и передавать обратно через ваш AJAX-вызов.
В наши дни для этого есть библиотеки, которые значительно упрощают работу (и обрабатывают сложные биты, такие как переподключения, обработка сокетов, откат TCP и т. д.), т. е.
Я бы посоветовал изучить использование AJAX. Я не PHP-разработчик, но я думаю, что вы можете подключить вызов AJAX к API и обновить свою веб-страницу.
Phirehose, безусловно, путь: