ホームページ  >  記事  >  バックエンド開発  >  PHPでシェルスクリプトの出力をリアルタイムに表示する方法

PHPでシェルスクリプトの出力をリアルタイムに表示する方法

WBOY
WBOYオリジナル
2016-06-23 13:50:352099ブラウズ

みなさん、こんにちは。ワンクリック起動機能を実装するシェルスクリプトができました。これを Web バージョンにしたいと考えています
しかし、このスクリプトの実行には約 2 ~ 3 分と長い時間がかかり、その間にいくつかの成功プロンプトが画面にエコー表示されます

しかし、今は php を使用してこのスクリプトを調整しています。 exec と system を実行すると、ステートメントが Web ページに印刷される前に、スクリプトが完全に実行されるまで待つ必要があることがわかりました
さて、私の質問は、シェルはステートメントを印刷してから、代わりに Web ページにステートメントを表示できるかということです。シェルが完全に実行されるのを待っていますか? 完成したら一緒に紹介します

皆さんありがとうございます!


ディスカッションに返信 (解決策)

echo ステートメントはシェル内にあります。これを行うことができます
シェルを呼び出すときに、出力リダイレクトを追加し、それをファイルに追加できます。このシェルを呼び出すには、以下が必要です。バックグラウンドで実行されます。
次に、php を使用して tail コマンドを呼び出し、出力ファイルを読み取り、毎秒表示します。バッファを 0 に設定する必要があります。そうしないと、表示されるまで 4096 待機します。

例:
exec("/home/web/a.sh >> /home/web/a.log 2>&1 &");
$log = file_get_contents('/home/web/a. log ');
ここでは、各行を配列に記録し、毎回新しい行のみをエコーすることができます。

exec も system も関数です
関数なので、呼び出されると必ず戻りを待ちます
呼び出された関数にコールバック関数がない限り

exec も system もコールバック関数インターフェイスを提供していないため、完了するのを待つだけです

echo ステートメントはシェル内にありますよね? 次のようになります
シェルを呼び出すとき、出力リダイレクトを追加してファイルに追加できます。このシェルを呼び出すには次のようにする必要があります。バックグラウンドで実行されます。
次に、php を使用して tail コマンドを呼び出し、出力ファイルを読み取り、毎秒表示します。バッファを 0 に設定する必要があります。そうしないと、表示されるまで 4096 待機します。

例:
exec("/home/web/a.sh >> /home/web/a.log 2>&1 &");
$log = file_get_contents('/home/web/a. log ');
ここでは、各行を配列に記録し、毎回新しい行のみをエコーすることができます。


ご返信ありがとうございます。この手順が完了したら再度投稿します。何か問題が発生した場合は、お知らせください

execもsystemも関数です
関数なので呼び出されると必ず戻りを待ちます
呼び出された関数にコールバック関数がない限り

execもsystemも無いのでコールバック関数インターフェイスを提供します。あとは彼が完了するのを待つだけです



このステップを完了したら、もう一度投稿します。何か問題が発生した場合は、お知らせください

遅くなりましたが、上の 2 人のおかげで問題は解決しました
1 階の方法と同様です
スクリプトはバックグラウンドで実行する必要があります。出力はファイルにリダイレクトされます
php は 1 秒ごとにファイルに新しく追加されたコンテンツを定期的に読み取ります。ここで、ファイルのオフセットを記録し、fseek を使用してそれを見つけます。スクリプト、途中から飛び出して終わります

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。