Javascript Phantomjs进程间通信

Javascript Phantomjs进程间通信,javascript,phantomjs,pipe,Javascript,Phantomjs,Pipe,我正在尝试实现一个解决方案,通过使用PhantomJS,打开一个web位置并对其进行评估,然后将输出保存到一个文件中进行处理。特别是扫描恶意脚本。我已经能够使用运行过一次的PhantomJS来实现这个解决方案。例如,这非常有效 var system = require('system'); var page = require('webpage').create(); var lastReceived = new Date().getTime(); var requestCount = 0; v

我正在尝试实现一个解决方案,通过使用PhantomJS,打开一个web位置并对其进行评估,然后将输出保存到一个文件中进行处理。特别是扫描恶意脚本。我已经能够使用运行过一次的PhantomJS来实现这个解决方案。例如,这非常有效

var system = require('system');
var page = require('webpage').create();
var lastReceived = new Date().getTime();
var requestCount = 0;
var responseCount = 0;
var requestIds = [];
var fileSystem = require('fs');
var startTime = new Date().getTime();

page.onResourceReceived = function (response) {
    if(requestIds.indexOf(response.id) !== -1) {
        lastReceived = new Date().getTime();
        responseCount++;
        requestIds[requestIds.indexOf(response.id)] = null;
    }
};
page.onResourceRequested = function (request) {
    if(requestIds.indexOf(request.id) === -1) {
        requestIds.push(request.id);
        requestCount++;
    }
};

page.open('http://adserver.example.com/adserve/;ID=164857;size=300x250;setID=162909;type=iframe', function () {});

var checkComplete = function () {
    // We don't allow it to take longer than 5 seconds but
    // don't return until all requests are finished
    if((new Date().getTime() - lastReceived > 300 && requestCount === responseCount) || new Date().getTime() - startTime > 5000)  {
        clearInterval(checkCompleteInterval);
        console.log(page.content);
        phantom.exit();
    }
}

var checkCompleteInterval = setInterval(checkComplete, 1);
然而,我在尝试创建一个自动化的系统时遇到了巨大的困难,这个系统不需要不断地重新启动phantomj,这会带来相当大的开销。
我尝试使用命名管道进行读取,然后尝试打开传递的url,但由于某些原因,它无法正常打开。我希望并非常感谢任何有关这方面的指导

值得一提的是,PhantomJS擅长HTTP通信。这就是为什么对于高级功能和更好的性能,我总是使用资源池模式+Web服务器模块。这个模块仍然是实验性的,但我一直发现它非常稳定,直到现在

因此,我认为在您的情况下,最好是通过HTTP进行通信,而不是通过IO文件进行通信

下面是一个非常基本的例子:

var page = require('webpage').create();
var server = require('webserver').create();
var system = require('system');
var host, port;

if (system.args.length !== 2) {
    console.log('Usage: server.js <some port>');
    phantom.exit(1);
} else {
    port = system.args[1];
    var listening = server.listen(port, function (request, response) {
        var page=require('webpage').create();
        page.open(request.post.target, function(status){
            response.write("Hello "+page.title);
            response.close();
        });
    });
    if (!listening) {
        console.log("could not create web server listening on port " + port);
        phantom.exit();
    }

    //test only
    var url = "http://localhost:" + port + "/";
    console.log("SENDING REQUEST TO:");
    console.log(url);
    var data='target=http://stackoverflow.com/';
    page.open(url,'post', data, function (status) {
        if (status !== 'success') {
            console.log('FAIL to load the address');
        } else {
            console.log("GOT REPLY FROM SERVER:");
            console.log(page.content);
        }
        phantom.exit();
    });
}
var page=require('webpage').create();
var server=require('webserver')。create();
var系统=要求(“系统”);
var主机、端口;
if(system.args.length!==2){
log('Usage:server.js');
幻影。出口(1);
}否则{
port=system.args[1];
var listening=server.listen(端口、函数(请求、响应){
var page=require('webpage')。create();
页面打开(request.post.target,函数(状态){
回答。写(“你好”+页面标题);
response.close();
});
});
如果(!倾听){
log(“无法创建web服务器侦听端口”+端口);
phantom.exit();
}
//仅测试
变量url=”http://localhost:“+端口+”/”;
日志(“将请求发送到:”);
console.log(url);
var数据目标=http://stackoverflow.com/';
页面打开(url,'post',数据,函数(状态){
如果(状态!=“成功”){
console.log('加载地址失败');
}否则{
log(“从服务器获得回复:”);
console.log(page.content);
}
phantom.exit();
});
}

这是解决问题的一种极好的横向方法!