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() 块:

我知道它会在一个随机点阻塞,因为我尝试使用以下代码对其进行调试:

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);

有趣的事实

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.*"
    }
},