2012-03-20 64 views
3

ブラウザから一定の/ライブのフィードバックを与えながら、PHPからシェルスクリプトを実行するにはどうすればよいですか? 私はsystem機能のドキュメントから理解:PHPからのライブフィードバックでシェルスクリプトを実行するには?

システム()の呼び出しも、PHPはサーバー モジュールとして実行されている場合は、自動的に出力の各行の後に、Webサーバの 出力バッファをフラッシュしようとします。

「サーバーモジュール」として実行することで意味が分かりません。

例PHPコード:

<?php 

system('/var/lib/script_test.sh'); 

例のシェルコード:

#!/bin/bash 

echo "Start..." 
for i in {1..10} 
do 
     echo "$i..." 
     sleep 1 
done 
echo "Done." 

これは何:それは約10秒待ってから出力バッファへ、その後フラッシュします。

私がこれしたいこと:各出力行の後に出力バッファにフラッシュします。

+0

サーバモジュール= PHPはウェブサーバー(例えばmod_php)に埋め込まれ、 'cgi'モードでは実行されません。 –

答えて

2

popen()を使用すると、開いているプロセスの標準出力を処理できます。データのチャンクはob_flush()を使用してクライアントに送信でき、XHRを使用してデータを表示できます。

+0

当然のことながら、ブラウザには、それが表示されてもそれを表示する義務はありません。本当に最高のものは、ajaxポーリングなどを使用し、実際には非ブロック的な方法でプロセスを実行することです。 –

+0

@TylerEaves、良い考え。私はAJAX呼び出しを使用してシェルスクリプトを実行しているPHPページをロードしていますが、常にpopen()を使用してフラッシュすることができれば、それは私の状況にとって理想的です。 –

+0

私が実装したアプリ(PHPではない)でこれをやったのは、外側のページにジョブIDを割り当ててから、jobid/message/timestamp(unix整数スタイル)という構造のテーブルを持っていました。出力の各行/グループに対して、私はメッセージテーブルに挿入します。毎秒(これはイントラネットアプリなので待ち時間は短かった)。私はajax経由でポーリングし、最後に処理されたメッセージのジョブIDとタイムスタンプを渡し、タイムスタンプとテキストのjson配列を返しました。テキストをメッセージdivの先頭に追加しました。完了しました。シンプル。複数のユーザーで動作します。 –

2

1つのオプションは、シェルスクリプト内のファイルに書き込むことです。各ステップでは、ファイルの場所を指定します。あなたのウェブページでは、毎秒X秒/分のajax呼び出しを使用します。 ajaxコールは、ステータスファイルを読み込んでステータスまたは完了したステップを返すPHPスクリプトを呼び出します。

このアプローチの利点は、実際にシェルスクリプトを開始したばかりでなく、複数の訪問者がページのライブ情報を利用できることです。明らかに、それはあなたの必要に応じて望ましくないかもしれません。

もちろん、短所はajax間隔が長いほど更新が古くなることです。

+0

ファイルは冗長です。そのため、popenが存在し、標準出力ハンドラが存在します。 – rook

+0

popenではなくファイルアクセスが必要な状況には、クロススクリプトチェーン、リアルタイムデータフィード、xhr結果ブロードキャストが含まれますが、これに限定されません。 –

関連する問題