私の目的は、PHP とシェル スクリプトを使用してログ ファイル リーダーを作成することです。特定のエントリがログファイルに最後に表示された時刻を検出するために、スクリプトを定期的に実行する予定です。
それが機能する方法は、シェルコマンドを呼び出すPHPスクリプトを呼び出すことです
tac logfile.log | grep "what i am looking for" | head -n 1
また
tac logfile.log | head -n 1
このスクリプトが行うことは次のとおりです。
最初のスクリプトの場合:探しているものが見つかるまでログ ファイルを下から上にスキャンし、最初の行を表示します。これは、実際にはファイル内の最後の行です。
2 番目のスクリプトの場合:最後の行だけをスキャンして出力します。私はファイルを尾行しようとはしていません。
だから私の意図はファイルを最後から最後までスキャンすることですが、PHPはシェル出力から読み取った行を解析して簡単に解析できるため、これを行うにはphpが必要です。
私が解決しようとしている問題は、shell_exec、exec、backtick operator、system などの関数を使用して PHP からスクリプトを実行すると、すべて PHP スクリプトを実行し続けるか、結果を出力して、シェルの最初の部分を実行し続けることです ( tac logfile.log)。
CLI から完全に動作する理由がわかりませんが、PHP から同じスクリプトを実行すると、ログ ファイル全体を tac しようとして無期限に実行されます。tac と cat がこの問題を引き起こしていることに気付きました。「壊れたパイプ」というエラーが表示されることがあります。
私は何をすべきですか?どうすればこれを修正できますか?