回答:
目的は少し異なります。
exec()
システムコマンドを呼び出し、出力を自分で処理するためのものです。 system()
システムコマンドを実行し、すぐに出力(おそらくテキスト)を表示するためのものです。 passthru()
生の戻り値を希望するシステムコマンドを実行するためのものです-おそらく何かバイナリです。とにかく、私はそれらのどれも使用しないことをお勧めします。これらはすべて、移植性の低いコードを生成します。
izkata@izein:~$ dir -bash: dir: command not found
-FreeBSD
exec
、system
、passthru
。PHPコードは、それが実行される環境に依存しています。多くのセキュリティバグは、これを考慮していないためです。ここでは簡単な例です:stackoverflow.com/questions/3003145/...
http://php.net/ && Chipmunkninjaから 抜粋:
システム()関数
PHPのシステム関数は、実行するコマンドの文字列引数と、そのコマンドに渡す引数を受け取ります。この関数は、指定されたコマンドを実行し、結果のテキストを出力ストリーム(Webサーバー状況でのHTTP出力、またはコマンドラインツールとしてPHPを実行している場合はコンソール)にダンプします。この関数の戻り値は、プログラムからの出力の最後の行です(テキスト出力を出す場合)。
EXEC()関数
システム関数は非常に便利で強力ですが、最大の問題の1つは、プログラムから生成されるすべてのテキストが直接出力ストリームに送られることです。結果のテキストをフォーマットして別の方法で表示したり、まったく表示したくない場合があります。
このため、PHPのexec関数は完全に適応されています。実行されているプログラムによって生成されたすべてのテキストを出力ストリームに自動的にダンプする代わりに、このテキストを関数の2番目のパラメーターで返される配列に入れる機会を提供します。
これまで実行してきたプログラムのほとんどは、多かれ少なかれ、実際のプログラムでした1。ただし、WindowsおよびUnixのユーザーが動作する環境は、実際にはこれよりもはるかに豊かです。Windowsユーザーには、Windowsコマンドプロンプトプログラムcmd.exeを使用するオプションがあります。このプログラムはコマンドシェルと呼ばれます。
パススルー()関数
PHPが提供する魅力的な関数の1つは、これまでに見たものと似ていますが、パススルー関数です。この関数は、他の関数と同様に、指定したプログラムを実行します。ただし、その後、このプログラムからの未加工の出力が、PHPが現在動作している出力ストリーム(つまり、WebサーバーシナリオのHTTP、またはPHPのコマンドラインバージョンのシェル)にすぐに送信されます。
proc_open()関数とのpopen() 関数
proc_open()はpopen()に似ていますが、プログラムの実行を大幅に制御できます。cmdは、シェルによって実行されるコマンドです。descriptorspecは、キーが記述子番号を表し、値がPHPがその記述子を子プロセスに渡す方法を表すインデックス付き配列です。パイプは、作成されたパイプのPHPの末尾に対応するファイルポインターのインデックス付き配列に設定されます。戻り値はプロセスを表すリソースです。使い終わったら、proc_close()を使用して解放する必要があります。
以前の回答はすべて少し混乱または不完全であるように思われるため、ここに違いの表を示します...
+----------------+-----------------+----------------+----------------+
| Command | Displays Output | Can Get Output | Gets Exit Code |
+----------------+-----------------+----------------+----------------+
| system() | Yes (as text) | Last line only | Yes |
| passthru() | Yes (raw) | No | Yes |
| exec() | No | Yes (array) | Yes |
| shell_exec() | No | Yes (string) | No |
| backticks (``) | No | Yes (string) | No |
+----------------+-----------------+----------------+----------------+
その他の注意事項:
include
と友達が欲しいと思う
実際には、コマンドが返す可能性のある出力をどのように処理するか、および呼び出し先プログラムが終了するまでPHPスクリプトを待機させるかどうかがすべてです。
exec
コマンドを実行し、出力を呼び出し元に渡します(またはオプションの変数に返します)。
passthru
exec()
コマンドを実行するという点で関数に似ています。この関数は、Unixコマンドの出力がバイナリデータの代わりに、exec()
またはsystem()
ブラウザに直接渡す必要がある場合に使用する必要があります。
system
外部プログラムを実行し、出力を表示しますが、最終行のみです。
コマンドを実行する必要があり、コマンドからのすべてのデータが干渉を受けることなく直接渡される場合は、 passthru()
関数をます。
コマンドラインからPHPスクリプトを実行している場合、passthru()
大きな利点が1つあります。それはあなたのようなスクリプト/プログラムを実行できるようになりますvim
、dialog
これらのプログラムは制御を処理し、が完了したときにのみスクリプトに戻ります。
system()
またはを使用する場合exec()
これらのスクリプト/プログラム実行する、機能しません。
落とし穴:何らかの理由less
でpassthru()
、PHPでは実行できません。
proc_open()
ともありpopen()
、どちらも生成されたプロセスをより高度に制御できます。