ホームページ バックエンド開発 PHPチュートリアル PHPコマンドラインツールshell_exec、exec、パススルー、システムの詳しい使い方紹介_PHPチュートリアル

PHPコマンドラインツールshell_exec、exec、パススルー、システムの詳しい使い方紹介_PHPチュートリアル

Jul 21, 2016 pm 03:24 PM
exec php shell system 導入 使用 注文 コマンドライン 道具 詳しい

これらのコマンドはすべて、指定したコマンドまたはスクリプトを実行する子プロセスを生成し、各子プロセスは標準出力 (stdout) に書き込まれるコマンド出力をキャプチャします。

shell_exec()

shell_exec() コマンドラインは、実際にはバックティック (`) 演算子のバリエーションにすぎません。シェルまたは Perl スクリプトを作成したことがある場合は、バックティック演算子内で他のコマンドの出力をキャプチャできることをご存知でしょう。たとえば、リスト 1 は、バッククォートを使用して、現在のディレクトリ内の各テキスト (.txt) の単語数を取得する方法を示しています。

リスト 1. バッククォートを使用して単語の数をカウントする

コードをコピーします コードは次のとおりです:

#! /bin/sh
number_of_words=`wc -w *.txt`
echo $ number_of_words

# 結果は次のようになります:
#165 readme.txt 388 results.txt 588 summary.txt
#など....

PHP スクリプトでは、shell_exec() コマンドでこれを実行できます。をリスト 2 に示すように実行すると、望ましい結果が得られます。ここでは、同じディレクトリにいくつかのテキストファイルが存在すると仮定します。

リスト 2. shell_exec() で同じコマンドを実行する
コードをコピーする コードは次のとおりです:

$results = shell_exec('wc -w *.txt') ;
echo $results;>

図 1 からわかるように、得られる結果はシェル スクリプトから得られるものと同じです。これは、shell_exec() を使用すると、シェルを通じて外部プログラムを実行し、結果を文字列として返すことができるためです。
図 1.shell_exec() 経由でシェル コマンドを実行した結果

PHP 命令行工具 shell exec, exec, passthru, system a669388d201eb3de以下に示すように、末尾のアポストロフィ演算子を使用するだけでも同じ結果が得られることに注意してください。
リスト 3. 末尾のアポストロフィ演算子のみを使用する

コードをコピーします コードは次のとおりです。
$results = `wc -w *.txt`;
echo $results;
?> ;

リスト 4 は、より簡単な方法を示しています。
リスト 4. より簡単な方法

コードをコピーします コードは次のとおりです。
echo `wc -w *.txt`?>


UNIX コマンドを使用するラインとシェル スクリプトが多くのことを実現できることを知っておくことが重要です。たとえば、パイプを使用してコマンドを接続できます。演算子を使用してその中にシェル スクリプトを作成し、そのシェル スクリプトを呼び出すこともできます (必要に応じてパラメータありまたはパラメータなし)。

たとえば、ディレクトリ内の最初の 5 つのテキスト ファイルの単語数のみをカウントしたい場合は、垂直バー (|) を使用して wc コマンドと head コマンドを接続できます。あるいは、以下に示すように、出力を pre タグ内に配置して、Web ブラウザーでより美しくレンダリングすることもできます。

リスト 5. より複雑なシェル コマンド


コードをコピーします コードは次のとおりです:
$results =shell_exec('wc -w *.txt | head -5') ;
echo ""

;
図 2 は、リスト 5 のスクリプトを実行した結果を示しています。
図 2. より複雑なシェル コマンドを実行した shell_exec() の結果
PHP 命令行工具 shell exec, exec, passthru, system f3a26409a75568a6
この記事の後半では、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() コマンドの実行結果

PHP 命令行工具 shell exec, exec, passthru, system 3cec849f89db6011 リスト 7 では、スクリプトのヘッダーの 5 の前にあるダッシュ (-) を削除することで小さなエラーを導入しました。
リスト 7. 単語カウント スクリプトにエラーを導入します

コードをコピーします コードは次のとおりです:
//以下にエラーを導入します (ヘッド コマンドから - を削除します)

passthru( 'wc -w *.txt | head 5',$returnval);
echo "
".$returnval;


スクリプトは期待どおりに実行されないことに注意してください。 。図 4 に示すように、空白の画面、水平線、および戻り値 1 が表示されます。このリターン コードは通常、何らかのエラーが発生したことを示します。リターンコードをテストできれば、バグの発見と修正がはるかに簡単になります。
図 4. passthru() 使用時のエラー コードの表示


PHP 命令行工具 shell exec, exec, passthru, system 9e8f40d55fd5196fexec()
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() が含まれます。次に、学んだことを自分のアプリケーションで実践する必要があります。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/324262.html技術記事これらのコマンドはすべて、指定したコマンドまたはスクリプトを実行する子プロセスを生成し、各子プロセスは標準出力 (stdout) に書き込まれるコマンド出力をキャプチャします。シェル_ex...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPとPythonの選択:ガイド PHPとPythonの選択:ガイド Apr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPの影響:Web開発など PHPの影響:Web開発など Apr 18, 2025 am 12:10 AM

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

WordPressのインストールの複雑さを解決する方法とComposerを使用して更新する WordPressのインストールの複雑さを解決する方法とComposerを使用して更新する Apr 17, 2025 pm 10:54 PM

WordPress Webサイトを管理する場合、インストール、更新、マルチサイト変換などの複雑な操作に遭遇することがよくあります。これらの操作は時間がかかるだけでなく、エラーになりやすく、ウェブサイトを麻痺させます。 WP-CRIコアコマンドと作曲家を組み合わせることで、これらのタスクを大幅に簡素化し、効率と信頼性を向上させることができます。この記事では、作曲家を使用してこれらの問題を解決し、WordPress管理の利便性を向上させる方法を紹介します。

PHPとPython:彼らの歴史を深く掘り下げます PHPとPython:彼らの歴史を深く掘り下げます Apr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

Laravelの複雑な属性の関係の問題を解決する方法は? Composerを使用してください! Laravelの複雑な属性の関係の問題を解決する方法は? Composerを使用してください! Apr 17, 2025 pm 09:54 PM

Laravel Developmentでは、特にマルチレベルの属する関係に関しては、複雑なモデル関係に対処することは常に課題でした。最近、私はこの問題に、従来のHasManyThrough関係がニーズを満たすことができず、データクエリが複雑で非効率的になることになっているマルチレベルモデル関​​係を扱うプロジェクトでこの問題に遭遇しました。いくつかの探索の後、私は図書館がStaudenmeir/属していることを発見しました。

PHPコード検査の加速:Overtrue/Phplintライブラリを使用した経験と練習 PHPコード検査の加速:Overtrue/Phplintライブラリを使用した経験と練習 Apr 17, 2025 pm 11:06 PM

開発プロセス中に、コードの正確性と保守性を確保するために、PHPコードで構文チェックを実行する必要があることがよくあります。ただし、プロジェクトが大きい場合、シングルスレッドの構文チェックプロセスが非常に遅くなる可能性があります。最近、私は自分のプロジェクトでこの問題に遭遇しました。複数の方法を試した後、最終的にライブラリがOvertrue/Phplintを見つけました。これにより、並列処理によりコード検査の速度が大幅に向上します。

SQL解析の問題を解決する方法は? Greenlion/PHP-SQL-Parserを使用してください! SQL解析の問題を解決する方法は? Greenlion/PHP-SQL-Parserを使用してください! Apr 17, 2025 pm 09:15 PM

SQLステートメントの解析を必要とするプロジェクトを開発するとき、私はトリッキーな問題に遭遇しました:MySQLのSQLステートメントを効率的に解析し、重要な情報を抽出する方法。多くの方法を試した後、Greenlion/PHP-SQL-Parserライブラリが私のニーズを完全に解決できることがわかりました。

See all articles