首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带幻影的Nodejs -集群刚刚停止

带幻影的Nodejs -集群刚刚停止
EN

Stack Overflow用户
提问于 2014-04-17 19:57:56
回答 2查看 524关注 0票数 0

我不是作为but服务器运行nodejs,而是从命令行运行经过大量修改的example.js版本,该版本附带了幻影集群包。服务器是AWS实例中的Ubuntu13.10。

我的目标是"ping“超过64000个urls来测试404或500个http错误。如果存在错误,则将该url与该错误一起记录以供以后处理。

这是我的代码:

代码语言:javascript
复制
(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);

引用为index.js的文件在这里:https://github.com/dailymuse/phantom-cluster/blob/master/index.js和我根本没有修改它。

这很好,并触发了20个工作进程,这些进程将为排队的urls获取初始响应代码。

问题是:在处理了960-990个urls之后,整个过程就停止了。没有错误代码,什么都没有。

我已经尝试了我能想到的一切,从某种节点超时,到一个给定的url问题,再到把我的头撞到我的桌子上。当我为它创建一个测试时,前两个将返回一个错误。第三个让我头疼。

有人有任何帮助或工作经验吗?

编辑I对代码进行了更新,并添加了on.response回调,然后调用nextTick方法将项从队列中删除。仍然有同样的问题。

EN

回答 2

Stack Overflow用户

发布于 2014-04-18 15:49:23

你看过链式履带机了吗?它使用幻影群集和预存器来完成你想要的几乎完全正确的工作。

票数 0
EN

Stack Overflow用户

发布于 2015-07-09 01:03:29

如果您所要做的只是检查HTTP状态代码,则不需要使用无头浏览器。节点可以自己使用http.request()或使用诸如请求-承诺之类的承诺来完成这一任务。

除非您需要在正在爬行的页面的呈现中验证某些内容,否则不需要在浏览器中呈现页面,只需对URL进行HTTP调用并反省它们的状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23142336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档