Javascript 带有幻影群集的Nodejs刚刚停止
我运行nodejs,不是作为一个web服务器,而是从命令行针对phantom cluster包附带的example.js的一个经过大量修改的版本。服务器是AWS实例中的Ubuntu13.10 我的目标是“ping”64000多个URL以测试404或500个http错误。如果有错误,则将该url与错误一起记录,以便以后处理 这是我的密码:Javascript 带有幻影群集的Nodejs刚刚停止,javascript,node.js,phantomjs,Javascript,Node.js,Phantomjs,我运行nodejs,不是作为一个web服务器,而是从命令行针对phantom cluster包附带的example.js的一个经过大量修改的版本。服务器是AWS实例中的Ubuntu13.10 我的目标是“ping”64000多个URL以测试404或500个http错误。如果有错误,则将该url与错误一起记录,以便以后处理 这是我的密码: (function() { var WEBSITES, cluster, enqueueRequests, main, phantomCluster; var
(function() {
var WEBSITES, cluster, enqueueRequests, main, phantomCluster;
var fs = require('fs');
phantomCluster = require("./index");
cluster = require("cluster");
WEBS = [];
function loadUrls(callback)
{
console.log("starting loaded");
var fs = require('fs');
var urls = [];
fs.readFile("/home/ubuntu/phantom-cluster/theurls.txt", 'utf8', function (err, data)
{
if (err) throw err;
var myArray = data.split("\n");
for(i=0;i<myArray.length;i++)
{
urls.push(myArray[i]);
}
callback(null,urls);
})
}
enqueueRequests = function(engine)
{
fulfilled = 0;
loadUrls(function(err,WEBS)
{
console.log(">>" + WEBS.length + " urls to process");
var enqueuer, i, key, _i, _results;
enqueuer = function(request)
{
var item;
item = engine.enqueue(request);
item.on("timeout", function()
{
fs.appendFile("/home/ubuntu/error_log.log", "TIMEOUT: " + request + "\r\n", function (err) {});
});
return item.on("response", function()
{
fulfilled++;
console.log(fulfilled);
});
};
_results = [];
for (i = i = 0;i < 1; i++)
{
_results.push((function()
{
var _results1;
_results1 = [];
for(x=0;x<WEBS.length;x++)
{
_results1.push(enqueuer(WEBS[x]));
}
return _results1;
})());
}
return _results;
});
};
main = function()
{
var engine;
engine = phantomCluster.createQueued(
{
workers: 20,
workerIterations: 1,
phantomBasePort: 54321
});
if (cluster.isMaster)
{
enqueueRequests(engine);
}
engine.on("queueItemReady", function(url)
{
var _this = this;
var retVal;
urlArray = url.split("|");
var phantom = this.ph;
var curPage = phantom.createPage(function(page)
{
page.set('settings.loadImages', false);
page.set('settings.javascriptEnabled', false);
page.set('settings.resourceTimeout', 5000);
page.set('settings.userAgent','Mozilla/5.001 (windows; U; NT4.0; en-US; rv:1.0) Gecko/25250101');
page.set('onError', function(msg, trace)
{
var msgStack = ['ERROR: ' + msg];
if (trace && trace.length)
{
msgStack.push('TRACE:');
trace.forEach(function(t)
{
msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : ''));
});
}
console.error(msgStack.join('\n'));
});
page.set('onResourceReceived', function(response)
{
if((response.status == "404") || (response.status == "500"))
{
myUrl = decodeURI(response.url);
if(myUrl == urlArray[0])
{
retVal = response.status + "|" + url;
fs.appendFile("/home/ubuntu/error_log.log", response.status + "|" + url + "\r\n", function (err) {});
return retVal;
}
}
});
page.open(urlArray[0], function(status)
{
_this.next(); // _this is a PhantomQueuedClusterClient object
return _this.queueItemResponse(status);
});
});
});
return engine.start();
};
main();
}).call(this);
(函数(){
var网站、集群、排队请求、主、幻影集群;
var fs=需要('fs');
phantomCluster=require(“./索引”);
集群=需要(“集群”);
网络=[];
函数loadURL(回调)
{
console.log(“启动加载”);
var fs=需要('fs');
var url=[];
fs.readFile(“/home/ubuntu/phantom cluster/theurls.txt”,'utf8',函数(err,data)
{
如果(错误)抛出错误;
var myArray=data.split(“\n”);
对于(i=0;i您看过了吗?它使用幻影群集和预渲染来完成几乎完全符合您需要的操作。如果您只需要检查HTTP状态代码,您不需要无头浏览器来完成此操作。Node可以使用自己的功能或使用类似承诺的功能来完成此操作
除非您需要在呈现正在爬行的页面时验证某些内容,否则无需在浏览器中呈现页面,只需对URL进行HTTP调用并反思其状态。如果您增加或减少工作进程的数量,它会改变什么吗?这似乎没有什么不同。我不知道是什么tthis.ph.createPage
或this.ph.exit
执行内部操作,但查看您的代码,如果页面已打开,您似乎只是将响应发送回队列返回此.queueItemResponse(状态)
,我认为处理过的项目没有从队列中释放出来,这会导致引擎在经过更多测试后停止,似乎确实存在基于工作人员数量的影响(第一个数字是已处理的URL,第二个是允许的工作人员数量):965-25-错误“无法读取未定义的972-20 981-15 993-10 1003-5的属性'getsocketname',因此根据您的建议,我将return process.nextTick(function(){});添加到return item.on(“response”),function()事件中,它没有效果。除非有其他方法从队列中释放我不知道的项(这是一个很好的可能性)