PHP を使用したことがある場合は、これが機能豊富な Web ページを作成するための優れたツールであることがわかるでしょう。主要なスクリプト言語として、PHP:
・学びやすい。・Rails プログラマーと同じくらい生産性を高める強力なフレームワーク (Cake
PHP や CodeIgniter など) がたくさんあります。
・MySQL、PostgreSQL、Microsoft SQL Server、さらには Oracle と通信する機能。・script.aculo.usやjQueryなどのJavaScriptフレームワークと簡単に統合する機能。
でも、もっとやりたい、もっとやらなきゃいけないこともある。つまり、
PHPが実行されているサーバーのファイルシステムを直接処理する必要があるということです。最終的には、ファイル システム上のファイルを操作したり、実行中のプロセスについて学習したり、その他のタスクを実行したりする必要があります。
まず、file()コマンドを使用して、PHPでファイルを開くことができました。しかし、ある時点で、何かを達成する唯一の方法は、サーバー上でシェル コマンド を実行し、特定の出力を取得することです。たとえば、特定のディレクトリに含まれるファイルの数を知りたい場合があります。または、特定のログ ファイルのセットに書き込まれた行数を知りたい場合もあります。または、ファイルを操作したり、別のディレクトリにコピーしたり、rsync を使用して別の場所に送信したりすることもできます。
記事「PHP commandline? Yes, you can!」では、Roger McCoy が Web ブラウザを使わずに PHP を コマンド ラインから直接使用する方法を示しています。この投稿では、同じトピックを別の角度から見て、基礎となるシェルコマンドと緊密に統合し、戻り値をインターフェースとプロセスに組み込む方法を示します。
これらの操作は、Linux、Berkeley Software Distribution (BSD)、またはその他の UNIX バージョンで実行している場合にのみ機能します。 Linux-Apache-MySQL-PHP (LAMP) スタックで実行していると仮定します。別のバージョンの UNIX を実行している場合は、使用できるコマンドラインがバージョンごとに異なるため、具体的な詳細が異なる場合があります。多くの人がまだ Mac OS X (BSD の一部のバージョンを実行している) で開発していることを私は知っているので、簡単に移植できるように、サンプル コマンド をできるだけ一般的なものにするように努めました。
コマンドラインの概要
PHP コマンドラインインターフェイス (CLI) サーバーアプリケーションプログラミングインターフェイス (SAPI) は、実験目的で PHP V4.2.0 でリリースされました。 V4.3.0 では完全にサポートされており、デフォルトで有効になっています。 PHP CLI SAPI を使用すると、PHP がサポートするシェル スクリプト (デスクトップベースのスクリプトも含む) を開発できます。実際、コマンドラインから直接実行できるツールをPHPで作成することが可能です。このようにして、PHP 開発者は Perl、AWK、Ruby、またはシェル プログラマーと同じくらい生産性を高めることができます。
この記事では、PHPが実行される基盤となるシェル環境とファイルシステムを理解できるように、PHPに組み込まれたツールについて説明します。 PHP は、shell_exec()、exec()、passthru()、system() など、外部 コマンド を実行するための関数を多数提供します。これらのコマンドは似ていますが、実行する外部プログラムに対して異なるインターフェイスを提供します。これらすべてのコマンドは、指定したコマンドまたはスクリプトを実行する子プロセスを生成し、各子プロセスは、標準出力 (stdout) に書き込まれるコマンド出力をキャッチします。
shell_exec()
shell_exec()コマンド 行は、実際にはバックティック (`) 演算子のバリエーションにすぎません。シェルまたは Perl スクリプトを書いたことがある場合は、バックティック演算子内で他の コマンド の出力をキャプチャできることをご存知でしょう。たとえば、リスト 1 は、バッククォートを使用して、現在のディレクトリ内の各テキスト (.txt) の単語数を取得する方法を示しています。
リスト1. バッククォートを使って単語の数を数えます#!/bin/sh
number_of_words=`wc -w *.txt`
$number_of_words をエコー
#result は次のようになります:
#165readme.txt 388results.txt 588summary.txt
#andso on....
リスト 2 に示すように、
PHP スクリプトで、shell_exec() でこの単純な コマンド を実行すると、必要な結果が得られます。ここでは、同じディレクトリにいくつかのテキストファイルが存在すると仮定します。
リスト 2. 同じコマンド
をshell_exec()で実行する
$results =shell_exec(wc -w *.txt);
$resultsをエコー;
?> $results =shell_exec(wc -w *.txt);
echo $results;
>
図1からわかるように、得られる結果はシェルスクリプトから得られるものと同じです。これは、shell_exec() を使用すると、シェルを通じて外部プログラムを実行し、結果を文字列として返すことができるためです。
図 1.shell_exec() を通してシェルコマンドを実行した結果
以下に示すように、末尾のアポストロフィ演算子を使用するだけでも同じ結果が得られることに注意してください。
リスト 3. 末尾のアポストロフィ演算子のみを使用する
$results =`wc -w *.txt`;
$resultsをエコー;
?> $results =`wc -w *.txt`;
echo $results;
>
リスト 4 は、より簡単な方法を示しています。
リスト 4. より簡単な方法
echo `wc -w *.txt`;
?> echo `wc -w *.txt`;
>
UNIX のコマンドライン スクリプトやシェル スクリプトを使用して多くのことができることを知っておくことが重要です。たとえば、パイプを使用してコマンドを接続できます。演算子を使用してシェル スクリプトを作成し、そのシェル スクリプトを呼び出すこともできます (必要に応じて引数の有無にかかわらず)。
たとえば、ディレクトリ内の最初の 5 つのテキスト ファイルの単語数のみをカウントしたい場合は、垂直バー (|) を使用して wc と head コマンドを接続できます。あるいは、以下に示すように、出力を pre タグ内に配置して、Web ブラウザーでより美しくレンダリングすることもできます。
リスト 5. より複雑なシェルコマンド
など)