PHPコマンドラインツールshell_exec,exec,passthru,system詳細使用紹介


これらのすべてのコマンドは、コマンドまたはスクリプトを実行するサブプロセスを派生し、各サブプロセスは、コマンド出力が標準出力に書き込まれたときにそれらをキャプチャします。shell_exec()shell_exec()コマンドラインは、実際にはアンチニックス(`)の演算子の変形体だけです。shellやPerlスクリプトを作成したことがあるなら、他のコマンドの出力は逆利きのオペレータの内部で捕捉できることを知っています。例えば、リスト1は、反則番号を使って現在のディレクトリでテキスト(.txt)ごとの単語数を取得する方法を示している。リスト1.アンチニックネームで単語数を計算する
 
#! /bin/sh
number_of_words=`wc -w *.txt`
echo $number_of_words

#result would be something like:
#165 readme.txt 388 results.txt 588 summary.txt
#and so on....
PHPスクリプトで、shell_でもいいです。exec()では、この簡単なコマンドを実行し、リスト2に示すように、結果を取得します。ここでは、同じディレクトリの下にテキストファイルがあると仮定します。リスト2.shell_exec()で同じコマンドを実行する
 
<?php
$results = shell_exec('wc -w *.txt');
echo $results;
?>
は、図1で見られ、得られた結果はshellスクリプトから得られたものと同じである。これはshell_のためですexec()は、shellを介して外部プログラムを実行し、結果を文字列で返します。図1.shell_によるexec()shellコマンドを実行した結果、PHP 命令行工具 shell exec, exec, passthru, system a669388d201eb3deに注意してください。後遺番号だけを使っても同じ結果が得られます。リスト3.後任番号のオペレータ
 
<?php
$results = `wc -w *.txt`;
echo $results;
?>
リスト4だけを使って、より簡単な方法を提供します。リスト4.より簡単な方法
 
<?php
echo `wc -w *.txt`;
?>
は、UNIXコマンドラインとshellスクリプトによって多くのものを作成することができます。これを知ることが重要です。例えば、縦線を使ってコマンドを接続してもいいです。オペレータを使ってshellスクリプトを作成し、必要に応じてshellスクリプトだけを呼び出すこともできます。例えば、ディレクトリの前の5つのテキストファイルの単語数だけを計算したい場合、縦線を使ってwcとheadコマンドを接続しても良いです。また、出力結果をpreタグの内部に入れて、Webブラウザによりより美しく表示することもできます。リスト5.より複雑なshellコマンド
 
<?php
$results = shell_exec('wc -w *.txt | head -5');
echo "<code lang="php">".$results . "</code>";
?>
図2は、実行リスト5のスクリプトの結果を示している。図2.shellからexec()より複雑なshellコマンドを実行して得られた結果PHP 命令行工具 shell exec, exec, passthru, system f3a26409a75568a6は、本明細書の後ろの部分にあります。PHPを使ってこれらのスクリプトにパラメータを伝える方法を学びます。今はshellコマンドを実行する方法として考えられますが、標準出力しか見られないことを覚えてください。コマンドやスクリプトにエラーが発生した場合、標準的なエラーが表示されなくなります。パスすると、外部プログラムを実行し、結果を画面に表示します。echoまたはreturnを使って結果を見る必要はありません。ブラウザに表示されます。オプションのパラメータを追加することができます。すなわち、外部プログラムから返されたコードを保存する変数、例えば成功した0を表します。これはデバッグのためのより良い仕組みを提供します。リスト6では、前の小節で実行する単語カウントスクリプトをコマンドで使います。ご覧のように、リターンコードを含む$returnval変数を追加します。リスト6.passthru()コマンドを使って単語カウントスクリプトを実行します。結果はそのまま画面に表示されます。図3.returnコードを使ってpassthru()コマンドを実行した結果PHP 命令行工具 shell exec, exec, passthru, system 3cec849f89db6011は、リスト7において、スクリプトヘッドの5つ前の短横線(-)を削除することにより、小さなエラーを導入した。リスト7.単語カウントスクリプトにエラーを導入しました。シナリオは予想通りに実行できませんでした。図4に示されているように、空白のスクリーン、水平線、戻り値1が得られます。このリターンコードは通常、いくつかのエラーが発生したことを示しています。コードをテストして戻すことができれば、エラーの検索と修復が容易になります。図4.passthru()を使用するとエラーコードPHP 命令行工具 shell exec, exec, passthru, system 9e8f40d55fd5196f exec()exec()コマンドとshell_exec()は同様で、異なる点は出力の最後の行に戻り、コマンドの完全な出力とエラーコードで配列を埋めることである。リスト8は、データ配列中のデータをキャプチャせずにexec()を実行するときに発生することを示している。リスト8.exec()を実行し、データ配列中のデータ
 
<?php
passthru('wc -w *.txt | head -5',$returnval);
echo "<hr/>".$returnval;
?>
を捕捉しないで、配列中の結果を獲得するために、配列の名前を第二のパラメータとしてexec()に追加する。このステップをリスト9で実行して、配列名として$dataを使用します。リスト9.exec()からデータ配列を捕捉した結果
 
<?php
//we introduce an error below (removing - from the head command)

passthru('wc -w *.txt | head 5',$returnval);
echo "<hr/>".$returnval;
?>
は、獲得配列中の結果の後、各ラインに対していくつかの処理を行うことができます。例えば、最初のスペースで分割して、分離された値をデータベーステーブルに格納したり、行ごとに特定の書式やマークを適用したりします。system()は、リスト10に示されるように、system()コマンドはハイブリッドです。外部プログラムから受信したものをそのまま出力します。また、exec()のように最後の行に戻り、リターンコードを利用できます。リスト10.system()コマンド
 
<?php
$results = exec('wc -w *.txt | head -5');
echo $results;
#would print out just the last line or results, i.e.:
#3847 myfile.txt
?>
のいくつかの例がありますが、これらのPHPコマンドの使い方は分かりましたが、まだ疑問があります。例えば、どのコマンドをいつ使うべきですか?これは完全にあなたの要求によって決められます。ほとんどの場合、execコマンドとデータ配列を使ってすべてのものを処理します。またはより簡単な命令に対してshell_を使う。exec()は、特に結果に無関心な場合。shellスクリプトを返すだけなら、パスを使います。通常、私は異なる場合には異なる関数を使いますが、時にはそれらは交換できます。これは私の気持ちと目的次第です。もう一つの質問は「彼らの長所は何ですか?」です。もし心当たりがないならば、あるいはプロジェクトがshell命令を使うのにとても適していますが、どうやって使うか分かりません。ここでいくつかの見解を提供します。各種のバックアップやファイル転送機能を提供するアプリケーションを作成している場合、shell_を使うことができます。exec()またはここで提供される他のコマンドの一つで、rsyncサポートのshellスクリプトを実行します。shellスクリプトを作成して、必要なrsyncコマンドを含んでから、passthruを使って、ユーザの命令またはcron作業に従って実行してもいいです。例えば、あるユーザがあなたのアプリケーションに適切な権限(例えば管理者権限)を持っています。彼は50のPDFファイルをサーバーから別のサーバに送信したいです。このユーザは、アプリケーションで正しい位置にナビゲーションし、Transferをクリックして送信するPDFを選択し、Submitをクリックします。このプロセスでは、フォームはPHPスクリプトを持っているべきです。これはリターンオプション変数を使って、パーサールシナリオを実行して、次のように問題があるかどうか分かります。リスト11.passthru()を通じてrsyncシナリオの一例としてのPHPスクリプト
 
<?php
$results = exec('wc -w *.txt | head -5',$data);
print_r($data);
#would print out the data array:
#Array ( [0]=> 555 text1.txt [1] => 283 text2.txt)
?>
を実行します。もしあなたのアプリケーションがプロセスまたはファイルをリストする必要があるならば、またはこれらのプロセスまたはファイルに関するデータは、ここでまとめたコマンドの一つを使って簡単にこの目的を実現できます。例えば、簡単なgrepコマンドは、特定の検索条件に合致するファイルを見つけるのを助けることができます。これをexec()コマンドと一緒に使って、結果を一つの配列に保存できます。これにより、HTMLテーブルまたはフォームを構築できます。他のコマンドを実行することができます。これまで、ユーザーが作成したイベントについて議論しました。ユーザーはボタンを押すか、リンクをクリックするだけで、PHPは相応のスクリプトを実行します。また、独立したPHPスクリプトとcronまたは他のスケジュールを一緒に使うこともできます。例えば、バックアップスクリプトがあれば、それを実行したり、PHPスクリプトに包装して実行したりできます。なぜこのようにしますか?これは余分なようですが、違いますか?そうではありません。このように考えてください。exec()またはpassthru()を通じてバックアップスクリプトを実行し、リターンコードに従っていくつかのアクションを実行します。エラーが発生したら、エラーログまたはデータベースに記録したり、警告メールを送信したりできます。スクリプトが成功すれば、元の出力をデータベースに保存することができます。ここで安全性について簡単に説明します。ユーザーからの入力を受け入れてshellに情報を伝達するなら、ユーザーの入力をフィルタしたほうがいいです。有害と思われるコマンドや許可されていない内容を削除します。sudo(スーパーユーザとして実行)やrm(削除)などです。実際には、オープンな要求をユーザに送信するのではなく、リストから選択させることを望むかもしれません。例えば、パラメータとして受け入れるファイルリストを実行します。一連のチェックボックスですべてのファイルを一覧表示してください。ユーザは選択ファイルを選択してキャンセルし、Submitをクリックしてrsync shellスクリプトをアクティブにします。ユーザーは自分でファイルを入力したり、正規表現を使ったりしてはいけません。------------------------------------------------------------------------------------------------------------本論文ではPHPコマンドを使ってshellスクリプトと他のコマンドを実行するための基礎知識を実証しました。これらのPHPコマンドにはshell_が含まれています。exec()、exec()、passthru()とsystem()です。今は自分のアプリで学んだ知識を実践してください。