2

私の目的は、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 がこの問題を引き起こしていることに気付きました。「壊れたパイプ」というエラーが表示されることがあります。

私は何をすべきですか?どうすればこれを修正できますか?

4

1 に答える 1

0

純粋な PHP を使用できます。fopen でファイルを開きます。ファイルを逆方向​​に読み取る方法の例は、 検索する文字列を見つけた後でループを中断するよりも、fseek を使用してファイルを 1 行ずつ逆方向に読み取る にあります。

于 2013-01-31T14:07:36.080 に答える