PhantomJS在Linux上的phantom.exit()之后崩溃

Eug*_*ene 2 javascript phantomjs

我试图在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/');
Run Code Online (Sandbox Code Playgroud)

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

Eli*_*gem 7

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

setTimeout(function()
{
    phantom.exit(0);
},0);
Run Code Online (Sandbox Code Playgroud)

这很愚蠢,但这应该是诀窍......在我链接到的github页面上有一个补丁.还有一些关于为什么会出现这个错误的细节.
我认为问题出在这里:

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

异步删除在我看来可能是bug的原因,因为处理程序返回后setTimeout,实际的exit调用被延迟,所有内容都可以删除它应该在何时何地.超时有效地将exit调用移到了处理程序的范围之外......
我还没有测试它,但如果是这样的话,可能还是:

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

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