PHPコマンドラインツールshell_exec、exec、パススルー、システムの詳しい使い方紹介_PHPチュートリアル
これらのコマンドはすべて、指定したコマンドまたはスクリプトを実行する子プロセスを生成し、各子プロセスは標準出力 (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() 経由でシェル コマンドを実行した結果

リスト 3. 末尾のアポストロフィ演算子のみを使用する
echo $results;
?> ;
リスト 4. より簡単な方法
UNIX コマンドを使用するラインとシェル スクリプトが多くのことを実現できることを知っておくことが重要です。たとえば、パイプを使用してコマンドを接続できます。演算子を使用してその中にシェル スクリプトを作成し、そのシェル スクリプトを呼び出すこともできます (必要に応じてパラメータありまたはパラメータなし)。
たとえば、ディレクトリ内の最初の 5 つのテキスト ファイルの単語数のみをカウントしたい場合は、垂直バー (|) を使用して wc コマンドと head コマンドを接続できます。あるいは、以下に示すように、出力を pre タグ内に配置して、Web ブラウザーでより美しくレンダリングすることもできます。
リスト 5. より複雑なシェル コマンド
echo "
"
;
図 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() が含まれます。次に、学んだことを自分のアプリケーションで実践する必要があります。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











CでChronoライブラリを使用すると、時間と時間の間隔をより正確に制御できます。このライブラリの魅力を探りましょう。 CのChronoライブラリは、時間と時間の間隔に対処するための最新の方法を提供する標準ライブラリの一部です。 Time.HとCtimeに苦しんでいるプログラマーにとって、Chronoは間違いなく恩恵です。コードの読みやすさと保守性を向上させるだけでなく、より高い精度と柔軟性も提供します。基本から始めましょう。 Chronoライブラリには、主に次の重要なコンポーネントが含まれています。STD:: Chrono :: System_Clock:現在の時間を取得するために使用されるシステムクロックを表します。 STD :: Chron

CのDMAとは、直接メモリアクセステクノロジーであるDirectMemoryAccessを指し、ハードウェアデバイスがCPU介入なしでメモリに直接データを送信できるようにします。 1)DMA操作は、ハードウェアデバイスとドライバーに大きく依存しており、実装方法はシステムごとに異なります。 2)メモリへの直接アクセスは、セキュリティリスクをもたらす可能性があり、コードの正確性とセキュリティを確保する必要があります。 3)DMAはパフォーマンスを改善できますが、不適切な使用はシステムのパフォーマンスの低下につながる可能性があります。実践と学習を通じて、DMAを使用するスキルを習得し、高速データ送信やリアルタイム信号処理などのシナリオでその効果を最大化できます。

Cのスレッドパフォーマンスの測定は、標準ライブラリのタイミングツール、パフォーマンス分析ツール、およびカスタムタイマーを使用できます。 1.ライブラリを使用して、実行時間を測定します。 2。パフォーマンス分析にはGPROFを使用します。手順には、コンピレーション中に-pgオプションを追加し、プログラムを実行してGmon.outファイルを生成し、パフォーマンスレポートの生成が含まれます。 3. ValgrindのCallGrindモジュールを使用して、より詳細な分析を実行します。手順には、プログラムを実行してCallGrind.outファイルを生成し、Kcachegrindを使用して結果を表示することが含まれます。 4.カスタムタイマーは、特定のコードセグメントの実行時間を柔軟に測定できます。これらの方法は、スレッドのパフォーマンスを完全に理解し、コードを最適化するのに役立ちます。

AIは、作曲家の使用を最適化するのに役立ちます。特定の方法には次のものが含まれます。1。依存関係管理の最適化:AIは依存関係を分析し、最適なバージョンの組み合わせを推奨し、競合を減らします。 2。自動コード生成:AIは、ベストプラクティスに準拠したComposer.jsonファイルを生成します。 3.コードの品質を改善する:AIは潜在的な問題を検出し、最適化の提案を提供し、コードの品質を向上させます。これらの方法は、開発者が効率とコードの品質を向上させるのに役立つ機械学習および自然言語処理技術を通じて実装されています。

Cは、リアルタイムオペレーティングシステム(RTOS)プログラミングでうまく機能し、効率的な実行効率と正確な時間管理を提供します。 1)Cハードウェアリソースの直接的な動作と効率的なメモリ管理を通じて、RTOのニーズを満たします。 2)オブジェクト指向の機能を使用して、Cは柔軟なタスクスケジューリングシステムを設計できます。 3)Cは効率的な割り込み処理をサポートしますが、リアルタイムを確保するには、動的メモリの割り当てと例外処理を避ける必要があります。 4)テンプレートプログラミングとインライン関数は、パフォーマンスの最適化に役立ちます。 5)実際のアプリケーションでは、Cを使用して効率的なロギングシステムを実装できます。

デジタル通貨の普及と開発により、ますます多くの人々がデジタル通貨アプリに注意を払い、使用し始めています。これらのアプリケーションは、デジタル資産を管理および取引するための便利な方法をユーザーに提供します。では、デジタル通貨アプリはどのようなソフトウェアですか?詳細な理解を持ち、世界のトップ10のデジタル通貨アプリの在庫を取得しましょう。

Cコードの最適化は、次の戦略を通じて実現できます。1。最適化のためにメモリを手動で管理する。 2。コンパイラ最適化ルールに準拠したコードを書きます。 3.適切なアルゴリズムとデータ構造を選択します。 4.インライン関数を使用して、コールオーバーヘッドを削減します。 5.コンパイル時に最適化するために、テンプレートメタプログラムを適用します。 6.不要なコピーを避け、移動セマンティクスと参照パラメーターを使用します。 7. constを正しく使用して、コンパイラの最適化を支援します。 8。std :: vectorなどの適切なデータ構造を選択します。

MySQLで文字セットと照合を構成する方法は次のとおりです。1。サーバーレベルでの文字セットとコレクションの設定:setNames'utf8 '; setCharacterSetutf8; setCollation_connection = 'utf8_general_ci'; 2。特定の文字セットと照合を使用するデータベースを作成します:createdatabaseexample_dbcharactersetutf8collateutf8_general_ci; 3.テーブルを作成するときに文字セットとコレクションを指定:createTableExample_table(idint
