2

我试图在 PhantomJS 之上构建一个非常简单的解决方案,但是在调用phantom.exit(). 例如,运行以下代码时:

var page = require('webpage').create();
page.onResourceRequested = function (request) {
    console.log('Request ' + request.url);
    phantom.exit();
};
page.open('http://www.google.com/');

在 Ubuntu (12.04.3 LTS) 和 CentOS (6.4) 上因分段错误而崩溃。如果我注释掉phantom.exit()它会列出请求的 URL,那么它基本上可以按预期工作。然而phantom.exit()这是我真正需要的东西,因为我想在某些情况下终止我的脚本(例如,尝试访问特定域)。我觉得我的问题太明显了,但不知道发生了什么。

4

1 回答 1

7

这是一个已知问题,但有一个简单的解决方法。不过,这是一个应该修复的错误,但现在:

setTimeout(function()
{
    phantom.exit(0);
},0);

这很愚蠢,但这应该可以解决问题……我链接到的 github 页面上也有一个补丁。还有一些关于为什么这个错误存在的更多细节。
我认为问题出在这里:

是的,你是对的 [phantom.exit 应该终止 PhantomJS 而不执行任何进一步的代码。],但是每次调用 m_pages[i]->close(); 调用 deleteLater() 这意味着每个对象都会被删除,但是是异步的……也许这就是问题所在。

在我看来,异步删除可能是导致该错误的原因,因为处理程序在 之后返回setTimeout,并且实际exit调用被延迟,因此可以在应在的时间和位置删除所有内容。超时有效地将exit调用移动到处理程序的范围之外......
我没有测试过它,但如果是这种情况,也许:

var closeFunc = function()
{
    phantom.exit(0);
};
page.onResourceRequested = function (request)
{
    console.log('Request ' + request.url);
    return closeFunc();
};

也会工作。如果是这样,那么您只需要使用其中一种解决方法,直到发布可靠的补丁或下一个版本,并修复错误。

于 2013-10-02T19:10:59.263 回答