忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/05/27 13:19 |
PHP1-83:OSコマンドを直接実行

exec、passthru、バッククォートといった命令は直接OSコマンドを叩いてくれます。
正直これらの命令の違いがいまいちわからないのですが、バイナリじゃなければとりあえずexecでいいやー的な。

問題点としては、OSのコマンドを直接叩くので環境によって互換性がありません。
typeはLinuxではコマンドの詳細を表示するコマンドですが、Windowsではファイルを読み込んで表示するコマンドです。
うっかりバッククォートを使ってしまうと環境移動の際に大変な目に遭うこともありますが、PHPでは処理が面倒なことをシェルコマンドを使用することで非常に簡単に処理できたりするといったメリットもあります。

ディレクトリ内の一部ファイルをページャーつきで新しい順に取得したい、などといった要求があった場合、PHPだけで処理を行うのは非常に困難です。
標準関数ではopendir、readdir、is_fileあたりを駆使して一旦全ファイルを取得後ソートしなければなりません。
あるいはdirクラスやDirectoryIteratorなんかもありますが、これらには取得条件を変更するメソッドなどは無いので、やはり一旦全ファイルを取得して並び替える必要があります。
ファイルが少数ならまだいいですが、何年も動いてるWebサーバのアクセスログをどうにかしろとか言われてもご勘弁願いたいところです。

こんなときこそOSコマンド。
exec('ls -At /var/log/apache2 | grep user_log | head -100 | tail -20',$dir);
わずか一行で済んでしまいました。
あとはheadやtailのところに適当にページャを埋め込めばさくっとログビューアの完成です。

最初に書いたとおり互換性には乏しく、bashのコマンドを使用しているのでLinux専用となっています。
Windowsのコマンドプロンプトにはlsもgrepもheadもtailも/var/log/apache2も存在しないため、このコマンドは動作しません。
Windowsと両対応させるにはおとなしくopendir等を利用するしかないでしょう。

PR


2009/07/03 18:38 | Comments(0) | TrackBack(0) | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<脳内百万本ディレクターDAKINI | HOME | PHP1-82:出力バッファリングのちょっとだけ便利な使い方>>
忍者ブログ[PR]