PhantomJs 和 PHP:stream_get_contents 停止随机读取
PhantomJs and PHP: stream_get_contents stops reading randomly
stream_get_contents()
真的把我吓坏了。经过 24 小时的不间断调试和测试来自整个 Internet 的解决方案以使其正常工作。
它基本上只是随机停止读取。
我正在做的是通过 proc_open()
加载一个带有 PhantomJs 的网页,然后加载读取进程给出的管道的结果。问题是每当我尝试读取管道、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 OS(使用 nginx)上测试了代码。
图书馆给我带来麻烦的地方大概是here。
尽管如此,这是我用来抓取网页的 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) shell 而不是来自 PHP?
- 我该如何解决这个问题?
- 会不会是 PHP 问题?
- 会不会是系统(防火墙等)问题?
有趣的事实
A library I have built to web scrape a website and return its result
used to work a month ago. The same code does not work anymore right now without changing anything to it.
问题已通过在 proc_open()
中使用临时文件而不是流管道得到解决。
此外,PhantomJs 1.9.8 php-phantomjs SHOULD NOT be installed as it gives issues with parsing the data out of the files. It's a known issue.
I have released a repository that fixes the problem to whoever wishes to use it.
安装
在您的应用程序中添加这些代码行composer.json。
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/GiampaoloFalqui/php-phantomjs"
}
],
"require": {
"jonnyw/php-phantomjs": "3.*"
}
},
stream_get_contents()
真的把我吓坏了。经过 24 小时的不间断调试和测试来自整个 Internet 的解决方案以使其正常工作。
它基本上只是随机停止读取。
我正在做的是通过 proc_open()
加载一个带有 PhantomJs 的网页,然后加载读取进程给出的管道的结果。问题是每当我尝试读取管道、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 OS(使用 nginx)上测试了代码。
图书馆给我带来麻烦的地方大概是here。
尽管如此,这是我用来抓取网页的 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) shell 而不是来自 PHP?
- 我该如何解决这个问题?
- 会不会是 PHP 问题?
- 会不会是系统(防火墙等)问题?
有趣的事实
A library I have built to web scrape a website and return its result used to work a month ago. The same code does not work anymore right now without changing anything to it.
问题已通过在 proc_open()
中使用临时文件而不是流管道得到解决。
此外,PhantomJs 1.9.8 php-phantomjs SHOULD NOT be installed as it gives issues with parsing the data out of the files. It's a known issue.
I have released a repository that fixes the problem to whoever wishes to use it.
安装
在您的应用程序中添加这些代码行composer.json。
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/GiampaoloFalqui/php-phantomjs"
}
],
"require": {
"jonnyw/php-phantomjs": "3.*"
}
},