正式名称は「PHP: Hypertext Preprocessor」であるが、一般的には「PHP」と省略して用いられる。このPHPとは、Personal Home Page Toolsの頭文字に由来する[1]。
PHPはCommon Gateway Interface (CGI) をサポートしており、CGIをサポートするWebサーバ上でPHPスクリプトを実行することができる。この他にもFastCGIを通じてWebサーバから起動したり、利用するWebサーバがモジュール機構を提供していれば、モジュールとしてWebサーバに組み込んだ状態で動作させることが可能である。その為、phpモジュールに脆弱性があった場合、簡単にWebサーバの権限を奪取され、サーバを破壊されることもある。
PHPは、PHP4以降Zend Engineをスクリプト言語を処理するエンジンとして利用している。Zend Engineは、PHP3の開発者によって設立されたZend Technologies Ltd.により開発されたソースコードが公開されているスクリプティングエンジンで、PHP5ではZend Engine 2.0になった。Zend Engineは基本的に1つのプロセスがインタプリタのコンテキストを1つだけ持つものとして設計されている。したがってマルチスレッドを用いたスクリプティングはサポートしていない。
Zend Engineを除くPHP本体は、PHP組み込み関数の実装を含むほか、Webサーバやコマンドラインインターフェイスとスクリプティングエンジンの間を仲介するSAPI (Server API)レイヤ、マルチスレッドで動くWebサーバのモジュールとして利用される場合にグローバル変数のセマンティクスを提供するTSRM (Thread Safe Resource Manager)、さまざまなプラットフォームの入出力機構やAPIの差異を吸収するためのStreamsレイヤから成る。
開発者はSAPIの提供するSPIを実装することで、さまざまなWebサーバのモジュールとしてPHPを動作させることができる。標準では以下のWebサーバ用のSAPIが提供されている。
CGI
AOLserver
Apache HTTP Server (バージョン 1.x 用 / 2.x 用)
Sun Java System Web Server
Roxen WebServer
Tux
ISAPI (Microsoft Internet Information Services等)
Caudium
Continuity
Pi3Web
thttpd
PHPを動作させる方法には、実行ファイル形式(CGI / FastCGI)、モジュール形式(mod_php / ISAPI)がある。どの形式を使用するかはWebサーバにより異なる。一例を挙げるならば、Apacheで動作させる場合はmod_phpを使用し、IISで動作させる場合はISAPIを使用し、lighttpdで動作させる場合はFastCGIを使用し、AN HTTPDで動作させる場合はCGIを使用する(いずれも代表例であり、他の形式でも動作させることは可能だが、実例は少ない)。
PHPにおいては一般的に実行ファイル形式よりもモジュール形式の方が高速に動作するとされる。そのためApacheとmod_phpの組み合わせがよく用いられている。ただし実行ファイル形式でもFastCGIを使用することによりモジュール形式と並ぶパフォーマンスを出すことも可能である(例えばlighttpdとFastCGIの組み合わせ)。
PHPにはWindows、UNIXなどのオペレーティングシステムに対応した処理系が存在する。一部の組み込み関数はプラットフォームごとに挙動が違うため、スクリプトによっては移植作業が必要になる場合がある。
また、多くのDBMSへのインターフェイスを標準で備えており、DBMSとの連携にも高い力を発揮する。
HTML埋め込み型の処理系としては他にASP、JSPなどがある。
PHPには様々な付加機能がPEARというオンラインライブラリ集でモジュールとして提供されており、同名のツールを使って導入/管理が出来る。Perlで言うCPANと同じ役割を持っている。
多くの構文をC言語、Java、Perlなどのプログラミング言語から転用しており、動的に生成させるウェブ・ページを速やかに作成できるのが特徴である。ウィキ構築に用いられるソフトの一つであるMediaWikiは、PHPによって書かれている。
幾つかのサンプルコードとその実行結果を交え、PHPの文書構造を解説する。
PHPは"<?php" と "?>"で囲まれた内部をPHPコードと認識し実行する。それ以外の部分は全てHTMLコードとしてそのまま出力される。<?phpif($a){?><div>HTMLコード</div><?php }else{?><span><?php echo "aは偽";?></span><?php }?>
<?phpと?>で囲まれていない部分を除外した際に、構文通りの構造に文書がなっていればPHPはこれを正しく実行する。出力は以下のようになる。(便宜上2通り記す)// $aが真の時の出力<div>HTMLコード</div> // $aが偽の時の出力<span>aは偽</span>
if、else(elseif)は条件評価の制御構造としてよく知られた構文であり、他にもPHPではfor、while(do)、foreach、switch文などの制御構造がサポートされる。break、continue等の制御構造文もあるが、ループ式を命名するlabel文構造はない。
記号$は変数であることを示し、続く文字はその名前である。PHPは比較的変数に寛容であり、変数が確保されていない場合は、これをエラーとせずにヌルとして処理する。<?php$a = x;$$a = y;echo $x; // yを出力?>
PHPは以下の型をサポートする
スカラー型
文字列型 (String)