shell — PhantomJs и PHP: stream_get_contents перестает читать случайно

stream_get_contents() действительно бесит меня. Это были 24 часа непрерывной отладки и тестирования решений со всего Интернета, чтобы заставить его работать.

Это в основном просто перестает читать случайно.

То, что я делаю, загружает веб-страницу с PhantomJs через proc_open() затем загрузите результат, читая каналы, заданные процессом. Проблема в том, что всякий раз, когда я пытаюсь прочитать либо каналы, stdout и stderr, stream_get_contents() блоки:

  • Это читает ничего такого из трубы STDOUT.
  • Он блокируется случайным образом в какой-то момент без завершения чтения канала STDERR.

Я знаю, что он блокируется в произвольной точке, потому что я пытался отладить его с помощью этого кода:

while(! feof($pipes[2])) {
echo stream_get_contents($pipes[2], 50);
}

echo "Finished!";

Странице никогда не удается отразить «Законченный!».

Библиотека, которую я использую, PHP-phantomjs.

Я абсолютно уверен, что это не проблема с моей стороны, потому что, если я пытаюсь выполнить phantomjs самостоятельно с временным файлом, сгенерированным из библиотеки, phantomjs выполняется правильно, и это дает мне правильный результат.

Я протестировал код как на Windows, так и на Linux (с помощью nginx).

Дело в том, что библиотека доставляет мне неприятности примерно Вот.

Тем не менее, это код PHP (упрощенный), который я использую для веб-очистки страницы:

$client = Client::getInstance();
$client->setBinDir(Config::get('phantomjs.bin'));
$client->setPhantomJs(Config::get('phantomjs.path'));
$client->setPhantomLoader(Config::get('phantomjs.loader'));

$client->debug(true);

$request = $client->getMessageFactory()->createRequest();

$request->setMethod('GET');
$request->setUrl('http://google.com');
$request->setTimeout("120000");

$response = $client->getMessageFactory()->createResponse();

$client->send($request, $response);
  • Почему в мире stream_get_contents() не читать совсем или же останавливается случайно во время чтения?**
  • Почему он работает через оболочку (windows / linux), а не из PHP?
  • Как мне исправить эту проблему?
  • Может ли это быть проблема PHP?
  • Может ли это быть проблемой системы (брандмауэр и т. Д.)?

Интересный факт

Библиотека, которую я построил, чтобы очистить веб-сайт и вернуть его результат.
используемый работать месяц назад. Тот же самый код больше не работает сейчас, ничего не меняя.

0

Решение

Проблема была решена путем использования временных файлов вместо потоковых каналов в proc_open(),

Кроме того, PhantomJs 1.9.8 с PHP-phantomjs НЕ СЛЕДУЕТ быть установленным, поскольку это дает проблемы с анализом данных из файлов. Это известная проблема.

Я выпустил репозиторий, который решает проблему для тех, кто хочет его использовать.


Добавьте эти строки кода в ваше приложение composer.json.

{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/GiampaoloFalqui/php-phantomjs"}
],
"require": {
"jonnyw/php-phantomjs": "3.*"}
},
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]