1

同様の質問が何度も何度も回答されていると確信しています。もしそうなら、私は間違った方向にグーグルで検索し、そのことをお詫びします.

私の問題: バックグラウンドでプロセスが実行されている Web ページを作成しています。私が話しているプロセスは R スクリプトであり、おそらく数日かけて実行されます。進行が開始されると、そのように開始されます。

exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));

プロセスがまだ実行されているかどうかを追跡したいと思います。このようにして、ユーザーがチェックすると、終了したかどうかのメッセージが表示されます。ユーザーがサーバーにアップロードした入力ファイルを選択すると、追跡が開始および停止されます。また、プロセスが終了したときにページを更新して、彼が見ているだけの場合にページが変更されるようにしたい.

私には2つの可能性があります。プロセスIDを介して確認するか、出力ファイルが生成されているかどうかを確認できます。

私は試した

while(is_process_running($ps)){ ob_flush(); flush(); sleep(1); }

これは、ページ上の他のすべての機能がフリーズすることを除いて、ある程度機能します。それが私の is_process_running($ps) 関数です。

function is_process_running($PID){ exec("ps $PID", $ProcessState); return(count($ProcessState) >= 2); }

私が本当に必要としているのは、最初のプロセスがまだ実行されているかどうかをチェックするバックグラウンドで実行されている別のプロセスであり、そうでない場合は、最初のプロセスが終了したときにページを更新します。どうやってそれをしますか?追加情報が必要な場合はお知らせください。すべての助けに感謝します。

4

2 に答える 2

1

symcbeanの答えで私はそれを解決することができました。私のjavascriptコードは、同じ問題に直面している人にとっておそらく有用なものです。私も改善の余地があります。私はまだ自分自身を初心者だと思っています。

function loadXMLDoc(){
    var xmlhttp;
    if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }else{// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    return xmlhttp;
}
function start(file,time){
    var xmlhttp = loadXMLDoc();
    if(lines == 0){
        timer = setInterval(function(){sendRequest(xmlhttp,file)},time);
    }
}
function sendRequest(xmlhttp,file){
    xmlhttp.open("POST",file,true);
    xmlhttp.send()
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200 && xmlhttp.responseText != ""){
            var text = xmlhttp.responseText;
            var splitted = text.split("\n");
            var length = splitted.length
            if(splitted[length-2]=="finished"){
                refresh_page();
                clearInterval(timer);
                lines = 0;
            }                   
        }
    }
}

startメソッドは、ファイルパスと、変更をチェックすることになっている時間間隔で呼び出されます。私が投稿しなかったページの更新方法に注意してください。ただし、ページで更新したいものは何でもかまいません。ファイルの最後の行に「終了」と表示されると、ページが更新されます。プロセスがすでに開始されているかどうかを確認するために、line変数を含めました。私はコードを完全にテストしていませんが、これまでのところ、私が望んでいることを実行しています。

于 2012-08-02T23:36:14.343 に答える
0

まず、プロセスを開始する方法にはいくつかの問題があります。実際には、プロセスを起動する PHP とは別のプロセス グループにある必要があります。

ステータスのチェックに関しては、http 接続の最後に PHP が長時間ぶら下がっているのは望ましくありません。また、Web サーバーにコンテンツをオンデマンドでブラウザにフラッシュさせ、ブラウザにそれを段階的にレンダリングさせることは非常に困難であり、壊れやすいものです。あるブラウザと Web サーバーの組み合わせで動作するようになったとしても、別のブラウザでは動作しない可能性があります。

Ajax を使用して、プロセスのステータス/進行状況を報告する単純なスクリプトをポーリングします。

于 2012-08-01T22:59:18.770 に答える