328

違いは何ですか?

各機能には特定の状況や理由がありますか? はいの場合、そのような状況の例をいくつか挙げていただけますか?

PHP.net によると、これらは外部プログラムの実行に使用されます。参照を参照 してください。私が見た例から、明らかな違いは見られません。

単純にスクリプト (bash または python) を実行するとしたら、どの機能を使用することをお勧めしますか?

4

5 に答える 5

209

それらはわずかに異なる目的を持っています。

  • exec()システムコマンドを呼び出し、おそらく自分で出力を処理するためのものです。
  • system()システム コマンドを実行し、すぐに出力 (おそらくテキスト) を表示するためのものです。
  • passthru()生のリターンが必要なシステムコマンドを実行するためのものです-おそらく何かバイナリです。

いずれにしても、使用しないことをお勧めします。それらはすべて、非常に移植性の低いコードを生成します。

于 2009-04-09T04:50:58.110 に答える
140

http://php.net/ && Chipmunkninjaからの 引用:

system( )関数

PHP のシステム関数は、実行するコマンドとそのコマンドに渡す引数を含む文字列引数を取ります。この関数は、指定されたコマンドを実行し、結果のテキストを出力ストリーム (Web サーバーの場合は HTTP 出力、コマンド ライン ツールとして PHP を実行している場合はコンソール) にダンプします。この関数の戻り値は、テキスト出力を発行する場合、プログラムからの出力の最後の行です。

exec( )関数

システム関数は非常に便利で強力ですが、最大の問題の 1 つは、プログラムから生成されたすべてのテキストが出力ストリームに直接送られることです。結果のテキストをフォーマットして別の方法で表示したり、まったく表示したくない場合があります。

これには、PHP の exec 関数が完全に適合しています。実行中のプログラムによって生成されたすべてのテキストを出力ストリームに自動的にダンプする代わりに、このテキストを関数の 2 番目のパラメーターで返される配列に入れることができます。

shell_exec ()関数

これまで実行してきたプログラムのほとんどは、多かれ少なかれ本物のプログラムでした1。しかし、Windows や Unix のユーザーが操作する環境は、実際にはこれよりもはるかに豊富です。Windows ユーザーには、Windows コマンド プロンプト プログラム cmd.exe を使用するオプションがあります。このプログラムは、コマンド シェルとして知られています。

passthru ()関数

これまで見てきたものと同様に PHP が提供する魅力的な機能の 1 つは、パススルー機能です。この関数は、他の関数と同様に、指定したプログラムを実行します。ただし、その後すぐに、このプログラムからの未加工の出力を、PHP が現在動作している出力ストリーム (つまり、Web サーバー シナリオでは HTTP、または PHP のコマンド ライン バージョンではシェル) に送信します。

proc_open ()関数とpopen() 関数

proc_open() は popen() に似ていますが、プログラムの実行に対してより高度な制御を提供します。cmd は、シェルによって実行されるコマンドです。descriptorspec は、キーが記述子番号を表し、値が PHP がその記述子を子プロセスに渡す方法を表すインデックス付き配列です。pipes は、作成されたパイプの PHP の末尾に対応するファイル ポインターのインデックス付き配列に設定されます。戻り値はプロセスを表すリソースです。終了したら、proc_close() を使用して解放する必要があります。

于 2014-01-09T09:23:48.543 に答える
22

最終的には、コマンドが返す可能性のある出力をどのように処理するか、および呼び出し先プログラムが終了するまで PHP スクリプトを待機させるかどうかにかかっています。

  • execコマンドを実行し、出力を呼び出し元に渡します (またはオプションの変数で返します)。

  • passthruexec()コマンドを実行するという点で関数に似ています。この関数は、代わりに、exec()またはsystem()Unix コマンドからの出力がバイナリ データであり、ブラウザに直接返す必要がある場合に使用する必要があります。

  • system外部プログラムを実行し、出力を表示しますが、最後の行のみを表示します。

コマンドを実行する必要があり、コマンドからのすべてのデータを干渉なしで直接返す必要がある場合は、passthru()関数を使用します。

于 2009-04-09T04:51:57.873 に答える
10

コマンドラインから PHP スクリプトを実行している場合、 にpassthru()は大きな利点が 1 つあります。vim、などのスクリプト/プログラムを実行しdialog、それらのプログラムに制御を処理させ、完了したときにのみスクリプトに戻ることができます。

これらのスクリプト/プログラムを使用system()または実行すると、機能しなくなります。exec()

less注意: 何らかの理由でpassthru()、PHP で実行できません。

于 2009-04-09T17:13:17.737 に答える