無料Wikiサービス | デモページ
Linuxなどのメモ書き

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";
?>

関連ページ


最終更新 2007/07/12 13:18:34 - kztomita
(2007/07/12 11:48:33 作成)