PHP CGIでの実行
1. 概要
PHPスクリプトをApacheモジュールからではなくCGIとして実行する場合のメモ。
2. 環境
Linux(Fedora Core 4)PHPは5.0.4がインストール済み(CLI SAPI)
3. CLI版(CLI SAPI)バイナリを使う場合
最初からインストールされているCLI SAPI版PHPを使ってphpスクリプトをCGI実行する例。
apache httpd.conf例
# スクリプトを置くディレクトリについて # .phpファイルをCGIとして実行するように設定 <Directory /usr/local/www> AddHandler cgi-script .php Options +ExecCGI </Directory>
#!/usr/bin/php <?php print "Content-Type: text/html\n\n"; print "foo"; ?>
CLI版を使用した場合は、PerlなどによるCGIスクリプトと同様に#!によるコマンドの指定や、HTTPヘッダ(Content-Type)の出力処理が必要になる。
4. CGI版(CGI SAPI)バイナリを使う場合
CGI版のPHPを使うとスクリプト内で#!やHTTPヘッダの出力をせずに、モジュール動作時と同じような処理でCGI実行できる。CLI/CGI版の違いやコンパイルの仕方は「PHP CGIでの実行」参照。
以下の例ではCGI SAPIバイナリは/usr/local/bin/php.cgiにインストールしたものとして説明する。
4.1 phpコマンドをWebツリーの外に置く場合
phpコマンドがWebツリー外(/usr/local/bin/php.cgi等)にあり、それを使用する場合はApacheのconfigはCLI SAPIの時と同じで以下のようにして置けばよい。apache httpd.conf例
# スクリプトを置くディレクトリについて # .phpファイルをCGIとして実行するように設定 <Directory /usr/local/www> AddHandler cgi-script .php Options +ExecCGI </Directory>
スクリプトについては、CGI SAPI版ではHTTPヘッダは自動で出力されるので、スクリプト内でprint "Content-Type: text/html\n\n";をする必要はなくなる。#!によるコマンドの指定は必要。
CGI版PHPでのスクリプト
#!/usr/local/bin/php.cgi <?php # ヘッダは自動で出力されるので不要 # print "Content-Type: text/html\n\n"; print "foo"; ?>
4.2 Action設定によるリダイレクトを使う場合
phpコマンドをWebツリー内に置いておき、ApacheのAction設定によりスクリプトへのRequestをphpコマンドにリダイレクトさせることによって、CGI実行することもできる。この場合は、4.1に較べ#!の指定も必要なくなる。
まず、DocumentRoot(以下の例では/usr/local/www)にCGI SAPI版phpコマンドを置く。以下の例ではcgi-binディレクトリにphp.cgiへのシンボリックリンクを作成している。
# cd /usr/local/www/cgi-bin # ln -s /usr/local/bin/php.cgi .
そして、以下の用にconfigを設定して、http://www.xxxx.com/test.phpへのアクセスはhttp://www.xxxx.com/cgi-bin/php.cgi/test.phpへのアクセスとしてリダイレクトされるようにする。
apache httpd.conf例
ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin/" <Directory /usr/local/www> AddHandler php4-script .php # .phpファイルでは/cgi-bin/php.cgiを実行 Action php4-script /cgi-bin/php.cgi # FollowSymLinksでリンクをたどれるようにしておく Options +ExecCGI +FollowSymLinks </Directory>
上記の設定により、test.phpは/cgi-bin/php.cgi(/usr/local/bin/php.cgi)から実行されるようになるので、#!によるコマンドの指定もいらなくなり、モジュール動作時と同じソースコードでCGI実行できるようになる。
CGI版PHPでのスクリプト
<?php print "foo"; ?>
関連ページ
- PHP CLI/CGI SAPI
-
http://jp.php.net/manual/ja/security.cgi-bin.php(CGI実行時にセキュリティ関連で注意すべき事項)