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等を利用するしかないでしょう。