我有PHP后端的应用程序。我知道如何使用PHP从简单的phantomjs应用程序获取输出。
$response = exec('/path/to/phantomjs myscript.js');
我的PhantomJS应用程序工作很长时间(带循环)并输出当前进度和进入脚本内部的操作以进行监视。
我需要做的是,
我确信PHP不适用于此目的,因为长轮询根本不是一种选择。
由于websocket / html5 sse的服务器推送支持,我认为其中一个是合适的。
经过谷歌搜索很长一段时间后,我发现了这个小应用https://github.com/joewalnes/websocketd
但不确定这是做我需要的正确方法。
无法弄清楚,如何从PhantomJS应用程序正确地输出到前端应用程序。
有什么建议吗?
答案 0 :(得分:1)
PhantomJS有一个内置服务器,这里是a nice answer about using it。
但是如果你想使用Websockets,它也是可行的,我个人发现使用Express.js和Socket.io是一件轻而易举的事。这是一个简短的概念代码:
var express = require("express");
var app = express();
var server = require("http").Server(app);
var io = require("socket.io")(server);
var iosocket;
// save websocket connection for later use
io.on("connection", function(socket){
iosocket = socket;
});
// GET request starts PhantomJS work, no matter how long
app.get("/launch-long-phantomjs-process", function(req, res){
res.send("I'm on it!");
var info = [];
var spawn = require('child_process').spawn,
child = spawn('/usr/bin/phantomjs', ['/path/to/phantomjs/script.js']);
console.log("Spawned parser");
// Save incoming data from PhantomJS
child.stdout.on('data', function (data) {
console.log(data.toString());
info.push(data.toString());
});
// Just in case of errors
child.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
// When PhantomJS exits, we can finally send
// collected data to browser via a websocket
child.on('close', function (code) {
iosocket.emit("info", info);
});
});
在这个方案中,PhantomJS只是通过console.log
将数据抽取回节点。当然,可以使用更复杂的桥接PhantomJS和节点的方式,如phantomjs-node或node-phantomjs-simple。