2017-03-27 11 views
-1

私はPHPバックエンドでアプリケーションを持っています。私はPHPを使って簡単なphantomjsアプリケーションから出力を得る方法を知っています。ストリームPhantomJSフロントエンドアプリケーションに出力

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

問題がある...

私PhantomJSアプリは非常に長い(ループ付き)時間と出力電流の進捗状況や目的を監視するための内部のスクリプトを行く行為を働きます。私がする必要がどのような

は、ユーザーがそれが を終了するまで、それはPHP /のWebSocket/HTML5 SSE(サーバー送信されたイベント)を使用して、出力のストリームにいくつかのボタン

  • を押したときにphantomjsスクリプトを実行するには、

    1. です

    アイデア

    私は長いポーリングがすべてではオプションではありませんので、PHPは、この目的のために適切な選択肢ではないことを確信しています。

    websocket/html5 sseのサーバープッシュサポートのため、そのうちの1つが適していると思います。

    長い時間のためにグーグルの後、私はこの小さなアプリケーションにhttps://github.com/joewalnes/websocketd

    ではなく、これは私が必要なものを行うための適切な方法であることを確認しました。

    PhantomJSアプリからフロントエンドアプリへの出力を正しくストリームする方法がわかりません。

    提案がありますか?

  • +0

    解決策を考え出すことができましたか? – Vaviloff

    答えて

    1

    PhantomJSにはサーバーが内蔵されています。ここにはa nice answer about using itがあります。

    Websocketを使いたいのであれば、それもやりやすいです。私は個人的にはExpress.jsを使ってSocket.ioを使っていると気付きました。ただconsole.logを経由して戻っノードにデータを掻き取っ吐くこの方式のPhantomJSで

    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-nodenode-phantomjs-simpleのように、PhantomJSとノードをブリッジするもっと洗練された方法を使用することもできます。

    関連する問題