PhantomJS内存泄漏和进程退出失败

时间:2014-09-24 20:27:04

标签: memory-leaks phantomjs

我目前正在开发一个PhantomJS项目,用于评估CSV文件指定的网页列表。我在我的程序中安装了NPM和node.js。

以下是该计划:

var async = require("async");
var webpage = require('webpage'),
    fs = require('fs');

var file_h = fs.open('C:\\Users\\morgan\\Documents\\FantasyApp\\URLPlayerListActive.txt', 'r');
var urls = [];
while (!file_h.atEnd()) {
    urls.push(file_h.readLine());
}

async.eachSeries(urls, function (url, done) {
    console.log(url)
    var page = webpage.create();
    page.open("http://"+url, function (status) {
        if (status !== 'success') {
            console.log('Unable to access network');
            console.log(status)
            var closeresults = page.close();
        } else {
            var evalresults = page.evaluate(function() {
                try {
                    table2csv('pgl_basic');
                    try {
                        ga('send','event','Tool','Action','CSV');
                    }
                    catch (e) {}
                    var list = document.querySelectorAll('#csv_pgl_basic');
                    var stats = [];
                    for (var i = 0; i < list.length; i++) {
                        stats.push(list[i].innerText);
                    }
                    return stats;
                    var closeresults = page.close();
                } catch (e) {
                    console.log(e);
                }
            });
            try {
                fs.write("C:\\Users\\morgan\\Documents\\FantasyApp\\Data\\"+url+".txt",     evalresults.join('\n'), 'w');
                var closeresults = page.close();
            } catch(e) {
                console.log(e);
                var closeresults = page.close();
            }
        }
        done();
    });
});
phantom.exit();

我的症状是进程内存增加,直到达到我的Windows最大值并崩溃,或者它完成了我的列表并且进程永远挂起。

我可以针对上述任何一个问题实施解决方案,但由于它们都发生了,我无法使用此脚本。

我正在寻找帮助防止内存泄漏或只是在脚本完成后关闭我的进程。这些症状可能源于相同的根本原因。

1 个答案:

答案 0 :(得分:1)

如果页面没有正确地进行垃圾回收,您可以尝试反复使用同一个实例。另一件事是你应该在脚本实际完成时调用phantom.exit,例如在eachSeries的回调中。

var page = webpage.create();
async.eachSeries(urls, function (url, done) {
    console.log(url)
    page.open("http://"+url, function (status) {
        if (status !== 'success') {
            console.log('Unable to access network');
            console.log(status)
        } else {
            var evalresults = page.evaluate(function() {
                try {
                    table2csv('pgl_basic');
                    try {
                        ga('send','event','Tool','Action','CSV');
                    }
                    catch (e) {}
                    var list = document.querySelectorAll('#csv_pgl_basic');
                    var stats = [];
                    for (var i = 0; i < list.length; i++) {
                        stats.push(list[i].innerText);
                    }
                    return stats;
                } catch (e) {
                    console.log(e);
                }
            });
            try {
                fs.write("C:\\Users\\morgan\\Documents\\FantasyApp\\Data\\"+url+".txt",     evalresults.join('\n'), 'w');
            } catch(e) {
                console.log(e);
            }
        }
        done();
    });
}, function(err){
    phantom.exit();
});

其他一些问题:

  • page.close并未返回任何内容,因此closeresults将为undefined
  • return之后的任何语句都无法执行。
  • page未在页面上下文中定义(page.evaluate内),因此page.close();会产生错误,可能会破坏您的代码。

请注册onConsoleMessageonError个活动以查看是否有错误。