Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将PhantomJS输出流到前端应用程序_Php_Html_Websocket_Phantomjs - Fatal编程技术网

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

Php 将PhantomJS输出流到前端应用程序,php,html,websocket,phantomjs,Php,Html,Websocket,Phantomjs,我有一个PHP后端应用程序。我知道如何仅使用PHP从简单的phantomjs应用程序获取输出 $response = exec('/path/to/phantomjs myscript.js'); 问题是。。。 我的PhantomJS应用程序工作很长时间(带有循环),并输出当前进度和脚本中的动作,以便于监控 我需要做的是 当用户按下某个按钮时执行phantomjs脚本 使用php/websocket/html5 sse(服务器发送的事件)对其输出进行流式处理,直到完成 思想 我确信PHP对于这

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

$response = exec('/path/to/phantomjs myscript.js');
问题是。。。 我的PhantomJS应用程序工作很长时间(带有循环),并输出当前进度和脚本中的动作,以便于监控

我需要做的是

  • 当用户按下某个按钮时执行phantomjs脚本
  • 使用php/websocket/html5 sse(服务器发送的事件)对其输出进行流式处理,直到完成
  • 思想 我确信PHP对于这个目的是不合适的,因为长轮询根本不是一个选项

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

    在谷歌搜索了很长时间后,我发现了这个小应用程序

    但我不确定这是否是做我需要的事情的正确方法

    不知道如何正确地将输出从PhantomJS应用程序流式传输到前端应用程序


    有什么建议吗?

    PhantomJS有一个内置服务器,下面是

    但是如果你想使用WebSocket,它也是可行的,我个人发现将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和node,比如or。

    那么您是否能够想出一个解决方案?