PHP の Shell_exec によるライブ出力モニタリング
PHP のshell_exec 関数は、PHP スクリプト内からシステム コマンドを実行する便利な方法を提供します。ただし、デフォルトでは、完了後にのみコマンドの出力全体が返されます。この制限により、長時間実行コマンドや対話型コマンドの進行状況をライブで監視することが困難になる可能性があります。
この制限に対処するために、PHP はプログラマがコマンド出力を段階的に読み取って表示できる代替オプションを提供し、ユーザーがコマンド出力を観察できるようにします。プロセスのライブ ステータス。
そのようなアプローチの 1 つは、PHP の Popen() 関数を使用することです。 Popen() を使用すると、スクリプトでプロセスの stdout ストリームを PHP ストリームとして開くことができ、開発者が通常のファイルであるかのように操作できるようになります。これにより、fread() などのメソッドを使用して、コマンドの出力をリアルタイムで読み取ることが可能になります。
ライブ出力の表示を簡素化するもう 1 つのメソッドは、 passthru() 関数です。この関数は、コマンドの結果を変数に格納せずに、現在の出力バッファに直接出力します。このアプローチは、追加の処理や操作を必要とせずに、コマンドからの出力を迅速に表示する場合に特に役立ちます。
ライブ出力モニタリングでの Popen() の使用を示すには、次のコードを検討してください。
<?php echo '<pre class="brush:php;toolbar:false">'; // Start the ping process $proc = popen('ping -c 10 127.0.0.1', 'r'); // Continuously read the output and display it in real-time while (!feof($proc)) { echo fread($proc, 4096); flush(); } echo '';
この例では、popen() を使用して ping コマンドの stdout ストリームを開き、それを $proc 変数に割り当てます。 while ループ内では、fread() 関数を使用して、コマンドからの出力をリアルタイムで継続的に読み取り、表示します。 flash() 関数は、出力がバッファリングせずにユーザーのブラウザに直接送信されるようにするために呼び出されます。このコードでは、popen() と fread() を使用することで、開発者が ping コマンドの進行状況をライブで監視し、生成された結果を観察できるようになります。
これらの手法を使用すると、特定の機能が妨げられる可能性があることに注意することが重要です。セッションやnginxバッファリングなどのサーバー構成。これらの問題に対処するには、出力バッファリング ループに入る前、またはヘッダー header('X-Accel-Buffering: no') を設定する前に session_write_close() を呼び出すことを検討してください。 nginx が出力をバッファリングしないようにします。
以上がPHP でシェル コマンドからのライブ出力を監視するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。