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

PhantomJS crashes after phantom.exit() on Linux

本文关键字:之后 崩溃 exit phantom Linux 上的 PhantomJS      更新时间:2023-09-26

我试图在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()是我真正需要的东西,因为我想在某些情况下终止我的脚本(例如尝试访问特定域(。我有一种感觉,我的问题太明显了,但不知道发生了什么。

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

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

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