ホームページ >バックエンド開発 >PHPチュートリアル >PHPコマンドラインツールshell_exec、exec、パススルー、システムの詳しい使い方紹介_PHPチュートリアル
これらのコマンドはすべて、指定したコマンドまたはスクリプトを実行する子プロセスを生成し、各子プロセスは標準出力 (stdout) に書き込まれるコマンド出力をキャプチャします。
shell_exec()
shell_exec() コマンドラインは、実際にはバックティック (`) 演算子のバリエーションにすぎません。シェルまたは Perl スクリプトを作成したことがある場合は、バックティック演算子内で他のコマンドの出力をキャプチャできることをご存知でしょう。たとえば、リスト 1 は、バッククォートを使用して、現在のディレクトリ内の各テキスト (.txt) の単語数を取得する方法を示しています。
リスト 1. バッククォートを使用して単語の数をカウントする
"
;
図 2 は、リスト 5 のスクリプトを実行した結果を示しています。
図 2. より複雑なシェル コマンドを実行した shell_exec() の結果
この記事の後半では、PHP を使用してこれらのスクリプトに引数を渡す方法を学習します。これをシェル コマンドを実行する方法と考えることができますが、表示できるのは標準出力のみであることに注意してください。コマンドまたはスクリプトでエラーが発生した場合、パイプ経由で標準エラー (stderr) を stdout に追加しない限り、標準エラー (stderr) は表示されません。
passthru()
passthru() を使用すると、外部プログラムを実行し、結果を画面に表示できます。ブラウザに表示される結果を確認するために echo や return を使用する必要はありません。オプションのパラメーターを追加できます。これは、外部プログラムから返されたコードを保持する変数 (成功を表す 0 など) であり、デバッグのためのより優れたメカニズムを提供します。
リスト 6 では、 passthru() コマンドを使用して、前のセクションで実行した単語カウント スクリプトを実行します。ご覧のとおり、リターン コードを含む $returnval 変数も追加しました。
リスト 6. passthru() コマンドを使用して、単語カウント スクリプトを実行します
コードをコピーします コードは次のとおりです。
passthru('wc -w *.txt | head -5',$returnval );
echo "
".$returnval;
何かを返すために echo を使用する必要はないことに注意してください。以下に示すように、結果は画面に直接表示されます。
図 3. 戻りコードを含む passthru() コマンドの実行結果
リスト 7 では、スクリプトのヘッダーの 5 の前にあるダッシュ (-) を削除することで小さなエラーを導入しました。
リスト 7. 単語カウント スクリプトにエラーを導入します
コードをコピーします コードは次のとおりです: //以下にエラーを導入します (ヘッド コマンドから - を削除します)
passthru( 'wc -w *.txt | head 5',$returnval);
echo "
".$returnval;
スクリプトは期待どおりに実行されないことに注意してください。 。図 4 に示すように、空白の画面、水平線、および戻り値 1 が表示されます。このリターン コードは通常、何らかのエラーが発生したことを示します。リターンコードをテストできれば、バグの発見と修正がはるかに簡単になります。 図 4. passthru() 使用時のエラー コードの表示
exec()
exec() コマンドは、出力の最後の行を返し、オプションでコマンドを完了する点を除いて、shell_exec() と似ています。コードは配列に代入されます。リスト 8 は、データ配列内のデータをキャプチャせずに exec() を実行した場合に何が起こるかを示しています。
リスト 8. データ配列内のデータをキャプチャせずに exec() を実行する
コードをコピーする コードは次のとおりです。 head - 5'); echo $results; #最後の行または結果だけを出力します: #3847 myfile.txt ?>
結果を配列でキャプチャするには、次の名前を使用します。 2 番目のパラメータとして配列が exec() に追加されます。リスト 9 では、$data を配列の名前として使用して、このステップを実行しました。
リスト 9. exec() からデータ配列の結果を取得する
コードをコピーする
コードは次のとおりです。
$results = exec('wc -w *.txt | head -5', $data); #データ配列を出力します: #Array ( [0]=> 555 text1.txt [1] => 283 text2.txt ) ?> 結果を配列に取得した後、各行に対していくつかの処理を実行できます。たとえば、最初のスペースで分割したり、分割された値をデータベース テーブルに保存したり、各行に特定の書式設定やタグを適用したりできます。
system()
リスト 10 に示すように、system() コマンドはハイブリッドです。 passthru() と同様に、外部プログラムから受け取ったものを直接出力します。また、exec() のように最後の行を返し、戻りコードを利用できるようにします。
リスト 10. system() コマンド
コードをコピーします
コードは次のとおりです:
system('wc -w *.txt | head -5');
#出力します:
#123 file1.txt 332 file2.txt 444 file3.txt
#など
? >
いくつかの例
これらの PHP コマンドの使用方法を理解したところで、まだいくつかの疑問があるかもしれません。たとえば、どのコマンドをいつ使用する必要があるか?すべてはあなたのニーズ次第です。
ほとんどの場合、すべてに exec() コマンドとデータ配列を使用します。または、特に結果を気にしない場合は、より単純なコマンドに shell_exec() を使用します。シェル スクリプトを返すだけの場合は、 passthru() を使用します。さまざまな機会に異なる機能を使用することがよくあり、場合によってはそれらを交換可能です。すべては私の気分と、何を達成しようとしているかによって決まります。
もう 1 つの質問は、「彼らの強みは何ですか?」です。まったく手がかりがない場合、またはシェル コマンドを使用するのに最適なプロジェクトはあるものの、その使用方法がわからない場合は、ここでいくつかの洞察を提供します。
さまざまなバックアップ機能やファイル転送機能を提供するアプリケーションを作成している場合は、shell_exec() またはここで提供されている他のコマンドのいずれかを使用して、rsync がサポートされているシェル スクリプトを実行することを選択できます。必要な rsync コマンドを組み込むシェル スクリプトを作成し、 passthru() を使用してユーザーのコマンドまたは cron ジョブに基づいてスクリプトを実行できます。
たとえば、アプリケーションで適切な権限 (管理者権限など) を持つユーザーが、あるサーバーから別のサーバーに 50 個の PDF ファイルを送信したいと考えています。次に、ユーザーはアプリケーション内の正しい場所に移動し、「転送」をクリックし、送信する必要がある PDF を選択して、「送信」をクリックする必要があります。その過程で、フォームには、次に示すように return オプション変数を使用して passthru() 経由で rsync スクリプトを実行する PHP スクリプトが含まれる必要があります。リスト 11. passthru() を通じて rsync スクリプトを実行するサンプル PHP スクリプト
コードをコピーします コードは次のとおりです。 passthru('xfer_rsync.sh',$returnvalue);
if ($ returnvalue != 0){
//問題があります!
//ここにエラーコードを追加します
}else{
//大丈夫です
//他のページにリダイレクトします
}
?>
アプリケーションでプロセスやファイル、あるいはそれらのプロセスやファイルに関するデータを一覧表示する必要がある場合は、この記事でまとめたコマンドのいずれかを使用して簡単にこれを実現できます。たとえば、単純な grep コマンドを使用すると、特定の検索条件に一致するファイルを見つけることができます。これを exec() コマンドとともに使用すると、結果が配列に保存され、HTML テーブルまたはフォームを構築できるようになり、さらに他のコマンドを実行できるようになります。
これまで、ユーザー生成イベントについて説明してきました。ユーザーがボタンを押すかリンクをクリックするたびに、PHP は対応するスクリプトを実行します。スタンドアロンの PHP スクリプトを cron または他のスケジューラとともに使用して、興味深い効果を実現することもできます。たとえば、バックアップ スクリプトがある場合は、cron 経由で実行することも、PHP スクリプトにパッケージ化して実行することもできます。なぜこれを行うのでしょうか?これは冗長だと思いませんか?それは当てはまりません。このように考える必要があります。exec() または passthru() 経由でバックアップ スクリプトを実行し、戻りコードに基づいて何らかの動作を実行できます。エラーが発生した場合は、エラー ログまたはデータベースにログを記録したり、警告電子メールを送信したりできます。スクリプトが成功した場合は、生の出力をデータベースにダンプできます (たとえば、rsync には冗長モードがあり、後で問題を診断するのに役立ちます)。
------------------------------------------------ --------------------------------
セキュリティ
ここでセキュリティについて簡単に説明しましょう: ユーザー入力を受け入れて情報を渡す場合シェルに追加する場合は、ユーザー入力をフィルタリングすることをお勧めします。 sudo (スーパーユーザーとして実行) や rm (削除) など、有害で許可されていないと思われるコマンドを削除します。実際には、おそらくユーザーにオープンリクエストを送信させるのではなく、リストから選択させることを望んでいるでしょう。
たとえば、ファイルのリストを引数として受け入れる転送プログラムを実行する場合は、一連のチェックボックスを使用してすべてのファイルをリストする必要があります。ユーザーは、[送信] をクリックしてファイルを選択および選択解除し、rsync シェル スクリプトをアクティブにすることができます。ユーザーは自分でファイルを入力したり、正規表現を使用したりすることはできません。
------------------------------------------------ --------------------------------
結論
この記事では、PHP コマンドを使用してシェル スクリプトを実行する方法を説明しました。などコマンドの基礎知識。これらの PHP コマンドには、shell_exec()、exec()、passthru()、および system() が含まれます。次に、学んだことを自分のアプリケーションで実践する必要があります。