Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有幻影群集的Nodejs刚刚停止_Javascript_Node.js_Phantomjs - Fatal编程技术网

Javascript 带有幻影群集的Nodejs刚刚停止

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

我运行nodejs,不是作为一个web服务器,而是从命令行针对phantom cluster包附带的example.js的一个经过大量修改的版本。服务器是AWS实例中的Ubuntu13.10

我的目标是“ping”64000多个URL以测试404或500个http错误。如果有错误,则将该url与错误一起记录,以便以后处理

这是我的密码:

(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调用并反思其状态。

如果您增加或减少工作进程的数量,它会改变什么吗?这似乎没有什么不同。我不知道是什么t
this.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()事件中,它没有效果。除非有其他方法从队列中释放我不知道的项(这是一个很好的可能性)