承前
では、
- CLI SAPIを使用する方法
- SSI で外部 PHP ファイルを使用する方法
について書いたが、どちらも今一つ使い勝手がよくなかった。
今回の方法を使うと、
- *.html に対しては特にパーミッションの設定変更(実行アクセス権の付与)や先頭行(shebang)の追加は不要
- *.html 内に <?php 〜 ?> を複数記述でき、かつ、各記述間でグローバル変数等も共有可
- $_GET、header() 等も有効
と、通常の *.php ファイルと全く同様に使用可能。
CGI-Wrapper を使う方法
要点は、
- CGI SAPI版 PHP を呼び出す CGI-Wrapper スクリプト(php.cgi)を用意し、Web 用ルートディレクトリに設置(パーミッションは700もしくは705)
- .htaccess にて、拡張子 html に対して独自ハンドラタイプ(myphp-cgi)を定義し(AddHandler)、当該ハンドラタイプに対して CGI-Wrapper スクリプトを実行するように設定(Action)
のようになる。
以下は当方で動作確認できた例。
php.cgi (CGI-Wrapper)
#! /usr/bin/bash exec /usr/local/bin/php-cgi
- Web 用のルートディレクトリに設置(他の場所に置く場合、.htaccess の Action も併せて変更要)
- パーミッションは 700(もしくは705)に設定
.htaccess
# ハンドラタイプ myphp-cgi に対して CGI-Wrapper(php.cgi) を実行 Action myphp-cgi /php.cgi #AddHandler myphp-cgi .html # 拡張子がhtmまたはhtmlの全ファイルをPHPとして解釈するとサーバに負荷がかかるため、 # ファイル名でフィルタして最小限に絞る(例はindex.htmとindex.htmlのみ対象) <Files ~ "^index\.html?$"> AddHandler myphp-cgi .html .htm </Files>
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>[PHP(CGI)]テストページ</title> </head> <body> <h1>拡張子htmlのファイルでPHPを実行するテスト</h1> <h2>PHP実行結果</h2> <?php $param_list = array(); foreach ($_GET as $key => $val) { $val = is_array($val) ? ('array(' . implode(", ", $val) . ')') : $val; $param_list[] = htmlspecialchars($key . '=' . $val, ENT_QUOTES); } $param_str = implode("\n", $param_list); $out_str = <<< _EOT_ <p>PHPを実行しました!</p> <h3>クエリ(\$_GET) 一覧</h3> <pre>{$param_str}</pre> _EOT_; echo($out_str); ?> </body> </html>