c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

ほぼバッドノウハウなPHP CGI

PHP4に苦しんでいる皆さんこんにちは、いつまでたってもPDOがつかえなかったり、ひどいですよね。
この間諸般の理由でPHP4のサーバーでPHP5をうごかさざるをえず、大変だった件について。

disclaimer

以下をマネしてなにがおこってもしりません。
特にラッパースクリプトのクエリを展開している所は(特にPOSTを取り込んでいる所は)理解した上でつかわないと、危ないです。

環境はいじっちゃいけない

Apacheの設定はいじっちゃいけない、.htaccessで出来る範囲ならOK。そんな状況でした。

PHP5をスタンドアローンで入れる

Apacheと連携させません、apxsとか指定しません。具体的にはこんなオプションでビルドします。

./configure --prefix=/home/httpd/php5 --with-mysql=/usr --with-libdir=lib64 --with-pdo-mysql=/usr --without-pgsql --enable-mbstring=all --enable-mbregex --with-pear

絶対に必要なのがprefixで、これの指定を忘れると、場合によってはお客さんに土下座参りするハメになります。
どこでもいいんですが、バッティングしないところに指定します。
他のオプションはお好みで。

サーバーにコンパイラが入ってたときはラッキーなので、そのままビルドしてinstallします。
ライブラリが足りない場合にはどうにかしましょう

php.iniは忘れずにコピーを(無くても大概動くけど)

phpCGIで実行する用意をする

こんな.htaccessを用意

Options +ExecCGI
AddHandler cgi-script .php

イヤな予感がしてきましたか?正解です。

じゃあこれで実行できるか?というと、まず実行できません

こんなラッパーを用意しましょう

#!/home/httpd/php5/bin/php -q
Content-Type: text/html;

<?php
$posts = explode ("&", fgets (STDIN));
foreach ($posts as $val) {
    $parts = explode ("=", $val);
    $_POST[$parts[0]] = urldecode($parts[1]);
} 

$posts = explode ("&", $_SERVER["QUERY_STRING"]);
foreach ($posts as $val) {
    $parts = explode ("=", $val);
    $_GET[$parts[0]] = urldecode($parts[1]);
}

$_SERVER['PHP_SELF'] = '/url/to/index.php';

include "target.php" ;

酷い実装ですね!


さて、target.phpが本来なら動かすはずのphpです。
適当にかきかえましょう!
さあ、これで大抵動く筈です!
mod_rewriteと連携すれば、動的なラッパーだって夢じゃない!かも!


CGI最高!!


あ、勿論パーミッションの実行ビットは立てて下さいね、chmod 755とかで。あくまでこれはPHPじゃなくて、phpインタプリタを使ったCGIなんですから。