将PhantomJS流输出到前端应用程序

时间:2017-03-27 13:55:38

标签: php html5 websocket phantomjs

我有PHP后端的应用程序。我知道如何使用PHP从简单的phantomjs应用程序获取输出。

$response = exec('/path/to/phantomjs myscript.js');

问题是......

我的PhantomJS应用程序工作很长时间(带循环)并输出当前进度和进入脚本内部的操作以进行监视。

我需要做的是,

  1. 当用户按下某个按钮时执行phantomjs脚本
  2. 使用php / websocket / html5 sse(服务器发送事件)流式传输输出直到完成
  3. 我确信PHP不适用于此目的,因为长轮询根本不是一种选择。

    由于websocket / html5 sse的服务器推送支持,我认为其中一个是合适的。

    经过谷歌搜索很长一段时间后,我发现了这个小应用https://github.com/joewalnes/websocketd

    但不确定这是做我需要的正确方法。

    无法弄清楚,如何从PhantomJS应用程序正确地输出到前端应用程序。

    有什么建议吗?

1 个答案:

答案 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-nodenode-phantomjs-simple