● PHP MaxSpeedとは? PHP MaxSpeedは、BYTECODEキャッシュやテンプレート技術を利用して PHPの実行速度を総合的に高速化させるためのPHP拡張モジュールです。 通常のPHP実行環境と比較して、数倍から数十倍実行速度を向上させることができます。 MaxSpeedは次のコンポーネントから構成されています。 ・BYTECODEキャッシュ -- スクリプトのコンパイルに関する処理時間を圧縮し、実行速度を向上させます。 ・永続変数アロケータ -- 高速なアクセスが可能な永続変数領域を確保可能にします。 ・スピードテンプレート -- マシンコードネーティブなテンプレートエンジンです。 ■■ BYTECODEキャッシュ 通常のPHP処理環境では、リクエストの度にPHPのスクリプトコンパイラが スクリプトをBYTECODEに変換して、その結果を実行エンジンが実行します。 PHP MaxSpeed を組み込んだ処理環境では、コンパイルされたBYTECODEのキャッシュを行うことで コンパイルに関するCPU処理コストを低減します。 処理の内容にもよりますが、スクリプトの実行速度を2倍から4倍程度向上させることができます。 BYTECODEキャッシュ機能は、PHP MaxSpeed拡張モジュールをPHPに組み込むだけで有効になります。 特別な設定は必要ありません。 ■■ 永続変数アロケータ 通常のPHP変数はリクエストの期間中のみ値を保持できます。 リレーショナルデータベースの場合、HTTPDとは別のプロセスで処理され、また内部処理が複雑なため 高速なデータアクセスを望めません。 セッション変数やシェアードメモリは、永続性を持つことができますが、 データを変数値として再ロードする際にアンシリアライズ処理を行いますので、 大量の要素をもつ配列変数を保持するためには時間的に不利です。 永続変数アロケータは、シリアライズ処理を伴わずにアクセスできる 特別な変数領域をHTTPDデーモンプロセスのヒープ領域に確保する機能をPHPの関数ライブラリとして提供します。 大量で頻繁にアクセスされるデータベース上のデータをこの特殊領域にコピーしデータ・キャッシュシステムとして使用することにより システム全体の性能を向上させることができます。 この変数領域は、PHPスクリプト上からは通常の変数と扱いが同じであるため、 プログラミングが非常に容易です。 ■■ 永続変数処理関数 システム上に複数の永続変数領域を定義することができます。 それぞれの永続変数領域は category とそれに属する key で指定することができます。 ■永続変数登録 void maxspeed_heap_set(string category, string key, mixed value) category および keyで指定された永続変数領域を確保し、値valueを格納します。 ※制約 valueにobject型のデータを含めることはできません。 ■永続変数読み出し mixed maxspeed_heap_get(string category, string key) category および keyで指定された永続変数領域を読み出します。 ■永続変数リスト取得 array maxspeed_heap_get_index(string category) category に属する定義済みの key 値の一覧を取得します。 ※ HTTPDデーモンプロセスの消滅とともに永続変数領域もメモリから解放されます。 スクリプトは、永続変数にアクセスする際まず最初に maxspeed_heap_get によって 永続変数領域が確保されているかチェックし、 もし確保されていなければ、データベース等からデータを再ロードし、 maxspeed_heap_set により永続変数領域を確保しデータを設定してください。 ■■ スピードテンプレート ■テンプレートとは? テンプレートは、プログラマとデザイナの作業分担を明確に分け平行作業を行うことを可能にし、 また、頻繁なプログラム、デザインの変更作業を容易にする技術です。 PHPによる大規模なWEBサイトの構築やパッケージの開発に非常に役立つ技術です。 テンプレート技術に使用されるプログラム要素は、テンプレートファイルと それに対しデータを加工するテンプレート関数呼び出しが含まれるPHPスクリプトプログラムです。 テンプレートファイルは、通常のHTMLファイルに似ています。 HTMLファイルとの相違点は、テンプレートファイル内のデータの加工が行われるべき部分に プログラムからアクセスできる様にする為に、テンプレート専用の特殊なタグが入っていることです。 テンプレートを使用したスクリプトのロジックは、大まかには次のようになります。 (1) テンプレートのロード (2) テンプレート上のデータ埋め込み部分へのデータ設定処理 (3) テンプレートのレンダリングと表示 ■PHP MaxSpeedにおけるテンプレート - スピードテンプレート スピードテンプレートにおいては、テンプレート用の特殊なタグとして次の2つのタグを用意しております。  ・テンプレートブロック識別子  ・テンプレートタグ識別子 テンプレートブロック識別子は、 の形をしており、ブロック識別子で囲まれた部分を一つの塊としてあつかうことができます。 可変個数ブロックとして定義することにより、 テンプレート処理関数を通してブロックの有効化・無効化、繰り返し処理の実現を可能にします。 (可変個数ブロックは、ブロック名文字列に'*'文字を含ませることにより定義します) ブロックはテンプレートとして取り扱うことが可能で、テンプレートの再利用性を向上させます。 また、あるテンプレートを他のテンプレートの中に組み入れる等のことができます。 テンプレートタグ識別子は、 {タグ名} の形をしており、この部分にテンプレート処理関数を通して、値(文字列)を割り付けることができます。 MaxSpeedでは、テンプレート処理を高速に実行することができるように、 テンプレート処理関数をマシンコードネーティブに実現しています。 また、テンプレートのキャッシングを行い、テンプレートファイル解析処理時間を短縮します。 高速化の結果、技巧的なプログラムを書く必要がなくなり、保守性が大幅に向上します。 PHPスクリプトのみで実現されたテンプレート機能に比べ、 数倍から場合によっては数十倍以上の高速化が可能です。 ■■テンプレート処理関数 ■テンプレートファイルのロード int maxspeed_template_load(string template_file_path, [string block_name]); 指定したテンプレートファイルをメモリにロードし、 テンプレートID(メモリ上にロードされたテンプレートに対する識別子)を返します。 第1引数:テンプレートファイルのパス 第2引数:ブロック名(省略可) 戻り値:テンプレートID 第2引数にブロック名称を指定することにより、指定したブロックのみをテンプレートとしてロードすることができます。 ブロックがネストしている場合、より内側のブロックは"->"で指定することができます。 例1) $attach_tpl = maxspeed_template_load('test_a.tpl'); 例2) $test_tpl = maxspeed_template_load('test.tpl', "main_block->sub_block->inner_block"); ■テンプレートタグへの値のセット bool maxspeed_template_assign(int template_id or block_id, string tag_name or block_name, string value); テンプレート上のテンプレートタグに値を設定します。 テンプレート上に同一名称のタグが複数ある場合、全てのタグに同一の値が設定されます。 ブロック名を指定した場合、そのブロック全体を指定した値で上書きします。 第1引数:テンプレートID 第2引数:タグ名 or ブロック名 第3引数:値 戻り値:テンプレートアクセスチェックモード時、テンプレート上に存在しないタグ名を指定した場合FALSE 例) maxspeed_template_assign($test_tpl, "content", "replace text"); ■複数テンプレートタグへの値の一括設定 bool maxspeed_template_assign_array(int template_id or block_id, array tagname_value); 第1引数:テンプレートID 第2引数:タグ名 or ブロック名 と 値 を組み合わせた連想配列 戻り値:テンプレートアクセスチェックモード時、テンプレート上に存在しないタグ名を指定した場合FALSE 連想配列を用いて複数のテンプレートタグへ一括して値を設定します。 複数のタグへ値を設定する場合、タグ毎に maxspeed_template_assign関数を呼び出すよりも高速に処理することができます。 例) maxspeed_template_assign_array($test_tpl, array("content1" => "text1", "content2" => "test2")); ■ブロックへのアクセス int maxspeed_template_fetch(int template_id or block_id, string block_name, [int block_no]); 第1引数:テンプレートID 第2引数:ブロック名 戻り値:有効なテンプレートIDで、かつ有効なブロック名があった場合、そのブロックに対するブロックID 指定したテンプレート(またはブロック)の中のブロックへアクセスし、ブロックID(ブロックへのポインタ情報)を返します。 ブロック名称文字列に'*'が含まれるブロックは、0個以上の可変個数のブロックとして扱われます。 block_noを指定してFetchを行って初めてブロックが有効化されます。 block_noは0から始まる数値です。[全てのFetch処理のうちのblock_noの最大値+1]個のブロックが有効化されます。 例1) $t_block_test = maxspeed_template_fetch($test_tpl, "block_test"); 例2) for ($row = 0; $row < 5; $row++) { $t_row = &maxspeed_template_fetch($t_table_test, "row*", $row); for ($col = 0; $col < 5; $col++) { $t_col = maxspeed_template_fetch($t_row, "col*", $col); maxspeed_template_assign($t_col, "cell_content","foo $row $col"); } } ■ブロックアクセス&テンプレートタグ値設定 bool maxspeed_template_fetch_assign(int template_id or block_id, string block_name, int block_no, string tag_name, string value); 第1引数:テンプレートID 第2引数:ブロック名 第3引数:ブロックNo. 第4引数:タグ名 or ブロック名 第5引数:値 戻り値:テンプレートアクセスチェックモード時、テンプレート上に存在しないタグ名を指定した場合FALSE 一度の処理でFetchとAssignを行います。 ブロックIDの取得はできません。 例) for ($row = 0; $row < 5; $row++) { $t_row = &maxspeed_template_fetch($t_table_test, "row*", $row); for ($col = 0; $col < 5; $col++) { maxspeed_template_fetch_assign($t_row, "col*", $col, "cell_content", "foo $row $col"); } } ■ブロックアクセス&テンプレートタグ値一括設定 bool maxspeed_template_fetch_assign_array(int template_id or block_id, string block_name, int block_no, array tagname_value); 第1引数:テンプレートID 第2引数:ブロック名 第3引数:ブロックNo. 第4引数:タグ名 or ブロック名 と 値 を組み合わせた連想配列 戻り値:テンプレートアクセスチェックモード時、テンプレート上に存在しないタグ名を指定した場合FALSE 一度の処理でFetchとAssign_Arrayを行います。 ブロックIDの取得はできません。 例) for ($row = 0; $row < 5; $row++) { $t_row = &maxspeed_template_fetch($t_table_test, "row*", $row); for ($col = 0; $col < 5; $col++) { maxspeed_template_fetch_assign_array($t_row, "col*", $col, array("cell_content" => "foo $row $col", "cell" => "$row")); } } ■テンプレート組み入れ bool maxspeed_template_attach(int template_id or block_id, string block_name or tag_name, int template_id or block_id); 第1引数:テンプレートID 第2引数:タグ名 or ブロック名 第3引数:テンプレートID or ブロックID 戻り値:テンプレートアクセスチェックモード時、テンプレート上に存在しないタグ名を指定した場合FALSE 他のテンプレートを既存のテンプレートの中(ブロック名かタグ名で指定したところ)に組み入れます。 組み入れ後は、Fetchによって組み入れ部分へアクセスすることができるようになります。 例) $main_tpl = maxspeed_template_load('main.tpl'); $attach_tpl = maxspeed_template_load('attach.tpl'); $sub_tpl = maxspeed_template_attach($test_tpl, "attach_test", $attach_tpl); maxspeed_template_assign($sub_tpl, "content", "attach content"); ■テンプレートレンダリング結果取得 string maxspeed_template_get(int template_id or block_id); テンプレート処理を行ってできた結果データを文字列として取得します。 例) maxspeed_template_assign($test_tpl, "copy_place", maxspeed_template_get($t_table_test)); ■テンプレートレンダリング結果画面表示 string maxspeed_template_print(int template_id or block_id); テンプレート処理を行ってできた結果データを画面に表示します。 例) maxspeed_template_print($test_tpl); ■テンプレートアクセスチェックモード string maxspeed_template_check_tagname(void); 各テンプレート関数内にて、タグ名(またはブロック名)の有効性チェックを行うように実行モードを変更します。 テンプレート関数にて、不正なタグ名称を指定した場合、Warningメッセージを表示し、 戻り値としてFALSEを返します。 この関数を実行しない場合、各テンプレート関数は不正なタグ名称でのアクセスを無視し、 戻り値としてTRUEを返します。 ■■ 高速化のための環境設定 BYTECODEのキャッシュ領域、変数アロケータにより確保された領域、テンプレートキャッシュ領域は、 HTTPDデーモンプロセスのヒープ領域に確保されます。 したがってHTTPDデーモンプロセスをできるかぎり生成・消滅を繰り返さないようにすることが高速化のカギになります。 これを実現するためには、Apacheの場合MAXCLIENTの値をメモリスワップが起きない程度に設定します。 また、MINSPARE SERVER,MAXSPARE SERVERの各値をMAXCLIENTと同じ値に設定します。