AN HTTPDでPHPを動かす

更新日:2003.8.20
作成日:2001.7.27

 ここでは PHPをインストールし、AN HTTPD上で簡単なPHPスクリプトを動かすまでの説明をします。PHPのバージョンによって設定が異なるため謎解きのような説明になっていますので、注意深く読み解いてください。
  1. ダウンロード
     PHP: Downloadsのページ から
    Windows Binaries
    ・PHP 4.x.x zip package
     (CGI binary plus server API versions for Apache, Apache2 (experimental), ISAPI, NSAPI, Servlet and Pi3Web. MySQL support built-in, many extensions included, packaged as zip)
    (installer.exeではない方)をダウンロードする。2005/3 下旬現在、php-4.3.11-Win32.zip が最新版である。
     新しいバージョンの PHP 5.0.x も出ている。XOOPSも バージョンが 2.9.0.2以降なら PHP5でも動作するので新しい物好きな人は試してみてもいいかもしれない。ただ、PHPスクリプトを自作し、PHP5の新機能を使用しているのでなければ PHP5を使う理由は何もないと筆者は思う。枯れた(使い込まれて安定したの意) PHP4の方が確実で安心できる。1年後に PHP5にバージョンアップするかどうかを考えても遅くないであろう。恐らくその頃になっても PHP4でも十分という結論もあるのではないかと想像します(一応筆者も試してみて、以下で述べる PHP_SELFの問題が PHP5で解決されていることを確認した。いつでも移行可能という感触は得た。詳しくは AN HTTPDでPHP5を動かす を参考に)。

    (注) AN HTTPDでは、php.exe での実行時に PHP_SELF が空になるという問題があります。たまたまかどうかバージョンが 4.3.0 と 4.3.1 だけは PHP_SELF が取得できるのですが、4.2.x 以前あるいは 4.3.2 以降では PHP_SELF が取得できません。そのため XOOPS や レッツPHP! のいくつかのスクリプトなど "PHP_SELF" を使った PHPスクリプトで "PHP_SELF" を "SCRIPT_NAME" に置き替えないと動作しません(参考1参考2AN HTTPDで XOOPS を動かす)。
     確実性を求める人は 4.3.1を使い、それ以降のバージョンは使わないのがいいかと思います。
     どうしても PHPの新しいバージョンを使いたいという方は(セキュリティ上は新しいバージョンを使うべきですが) PHP_SELFを取得する方法 を見つけましたので、試してみてください。
    (ISAPIで実行すれば PHP_SELF を取得できるのですが、ISAPI には不安定な要素があるので AN HTTPDでは基本的に ISAPIは使わないというのが定説になっています)


  2. インストール
     ダウンロードしたバイナリを解凍する。解凍先は例えば C:\php とする。
    (注) PHP 4.1.2 以降のバージョンでは php-4.x.x-Win32 というフォルダ付で解凍されるので、フォルダ名を例えば c:\php-4.x.x-Win32 -> c:\php のように変更する。

     C:\php\php4ts.dllを C:\Windows\system (WinNT/2000 では C:\winNT\system32、WinXP では C:\Windows\system32) 下にコピーする。
     C:\php\php.ini-dist を C:\Windows (WinNT/2000 では C:\WinNT) にコピーし、php.ini にrename(ファイル名を変更)する。renameしてからコピーするのは 2個所に php.ini ができるので厳禁。php.iniを変更したのに全く効かずに悩んだ人が山のようにいます。php.iniが2つあるときは C:\php の方が優先されるようであるが(環境変数 PATH設定の順序に関係するかもしれない)、要は C:\php\php.iniを絶対に作らないことである。

     php.ini の設定については PHPのバージョンによって異なるので、以下をよく読んで各バージョンに応じて適切に設定しなければ動かない。また、PHPも Perl同様、コマンドラインで実行可能なので、C:\phpにパス(PATH)を通しておくと何かと便利である。

    (注) PHPの実行プログラムが php.exeのとき、php.ini で、cgi.force_redirect = 1 -> 0 と変更し、行頭の ; を削除してアンコメントします(PHP 4.1.2 以降の全てのバージョンが対象 )。
    ; cgi.force_redirect = 1
     ↓
    cgi.force_redirect = 0
    実行プログラムが php.exe の場合に上記の設定が正しくできていないと以下のメッセージが出て PHPは実行されません。
    Security Alert! The PHP CGI cannot be accessed directly.

    This PHP CGI binary was compiled with force-cgi-redirect enabled. This means that a page will only be served up if the REDIRECT_STATUS CGI variable is set, e.g. via an Apache Action directive.

    For more information as to why this behaviour exists, see the manual page for CGI security.

    For more information about changing this behaviour or re-enabling this webserver, consult the installation file that came with this distribution, or visit the manual page.

    (注) PHP 4.1.0 以降では、php.iniで register_globals = Off になっています。そのためPHPスクリプトの中にはフォームから入力した文字列の受け渡しが正しく処理されないものがあります(特に古いスクリプトは要注意)。その場合、スクリプトが正しければ register_globals を On に変更すれば動くと思いますのでまず試してみてください。

     ただそのままインターネットで使い続けるのはセキュリティ上問題があります。頑張ってソースを書き替えるかあるいは別のスクリプトを探しましょう。この関連の 過去ログ を参考にしてください。
    PHP-users MLの以下で始まるスレッドも参考に
     http://ns1.php.gr.jp/pipermail/php-users/2003-November/019639.html


  3. AN HTTPDのオプション設定
     PHP は CGI 実行版(php.exe)または SAPIモジュール(AN HTTPDで使うのは php4isapi.dll)のいずれかで実行可能である。前者 php.exe で実行する場合には、AN HTTPDのオプション/一般の拡張子、実行プログラムの追加で下図のように入力し、OKする。
    PATH_TRANSLATEDを使う のチェックは必須である。
     (注) 拡張子の前のドットを忘れないように。



     一方、PHP を後者の php4isapi.dll (ISAPI) で実行する場合には、上図において実行プログラムの個所を c:\php\php.exe ではなく、c:\php\sapi\php4isapi.dll とする。

     PHPのインストールファイルにある install.txt の説明によると、ISAPIモジュールはパフォーマンスがよいが、安定性に問題があり、製品レベルの品質にはない とのことである。特に、Windows2000より古いプラットフォーム(Windows98など)では重大な信頼性の問題があると明記されている。現に、Win2000 上では簡単な PHP スクリプトが ISAPI で動くことを確認できたが、Win98 では強制終了になり、全く実行不可である(PHP 4.1.2の場合)。

     PHPの設定例を説明したホームページで、ISAPIの例を見かけることがあるが、OS が Win9x では絶対に ISAPIを使わないこと。また Win2000/XP なら安心というわけでもないので初めて実行するPHPスクリプトなどでは ISAPI は使わない方がいい。また ISAPIで正常に動作しないときは必ず php.exe でも動作確認すること。

    (追記) Win9xでISAPIが強制終了する件は、php.ini の設定によって起こらなくなったと説明したページをみつけた。その説明に従えば強制終了は発生しなくなることを筆者も確認した。
     http://ns1.php.gr.jp/pipermail/php-users/2002-March/006256.html

    万一リンク切れになっても参照可能なように、以下にコピーしておきます。
    251 display_errors = On(デバッグ用。サーバを公開する場合は Off で)
    256 display_startup_errors = On(同上)
    375 extension_dir = C:\hoge\php\extensions\(←エラーの原因みたい)
    462 extension=php_gd.dll (コメント「;」をはずす)(←ここも)
    473 extension=php_mbstring.dll (同上)(←と↓はマルチバイト関係)
    861 [mbstring] 以下5行のコメント「;」をはずす。
    
    筆者が確認した限りでは、extension_dir = C:\php\extensions\ と extension=php_gd.dll の2個所が影響していた。

    (追記に追記) 上記の追記に関してメールで質問があった(2003.3.12)のでさらに追記する。

     上の追記は OSが Win9x のときに強制終了しないようにするための設定を説明したものであるが、PHPのバージョンによってはWin2000/XPでも設定しないといけないことがあるようだ。また、繰り返すが強制終了が関係するのはあくまで extension_dir = C:\php\extensions\ と extension=php_gd.dll の2箇所だけである。mbstring についての部分は Win9xと Win2000/XP に共通なマルチバイト文字列に関する設定である。

     php.iniは 使用する Webサーバ、実行する PHPスクリプト、利用環境などに依存するので、誰かの php.ini の設定と同じにしないといけないわけではないし、設定すれば問題は起きないということでもない。とりあえず変更は必要最小限に止め、mbstring についても使っていて日本語が処理できない、文字化けするなどの問題が出るまでは(mb*** がどうのというエラーメッセージが出るとき)コメントのままでいいかと思う。

     例えば、AN HTTPDで実行プログラムが php.exe のとき doc_root は設定しなくてもよい(してはいけない)のだが、不用意に設定すると「No input file specified.」というエラーになってしまう。

     また、PHP 4.3.0 以降では上記の php.iniの「[mbstring] 以下5行のコメント「;」をはずす」という説明自体が適切ではなくなっている(その後のバージョンではさらに変わるかもしれないが)。4.3.0 以降では途中のコメント行を除くと以下の8行が該当する。
    --------------------------------------
    [mbstring]
    mbstring.language = Japanese
    mbstring.internal_encoding = EUC-JP
    mbstring.http_input = auto
    mbstring.http_output = pass (SJIS では文字化けすることがある)
    mbstring.encoding_translation = On (Off を On に. BBSなどで文字化けするようなら Offに)
    mbstring.detect_order = auto
    mbstring.substitute_character = none;
    mbstring.func_overload = 0
    --------------------------------------
    
    もし mbstring 関連の個所を変更するのであれば以下を参考にするとよい。
     http://wiz.syscon.co.jp/winphp.html の php.iniの設定
     http://tsuttayo.sytes.net/php/install/win.html の PHP4の設定
     http://www.php.net/manual/ja/ref.mbstring.php の例3 SJISユーザ用のphp.iniの設定

    mbstringに関しては上記の [mbstring] セクション以外に、以下の個所も設定が必要である。
    ----------------------------------
    extension_dir = C:\php\extensions\ (デフォルトの ./ をインストール先に合わせて変更)
    extension=php_mbstring.dll
    output_handler = mb_output_handler
    ----------------------------------
    
    その他に
    magic_quotes_gpc = Off も

    (追記その2) GD(php_gd.dll) から GD2(php_gd2.dll) への切り替えがバージョン 4.2.0-4.3.1 の頃にあったようで、これらのバージョンを使うときには注意が必要である。最新のバージョンでは php_gd.dll はなく php_gd2.dll になっている。もし、以下のようなエラーが出るときは php.ini を状況に合わせて設定変更することが必要(基本はバージョンが変わる毎にその php.iniを使い、必要な全ての書き替えをする)。

    「Unknown(): Unable to load dynamic library 'C:\php\extensions\php_gd.dll' - このアプリケーションの実行に必要なライブラリ ファイルのうちの 1 つが見つかりません。」
     ⇒ extension=php_gd.dll -> extension=php_gd2.dll
    「Unknown(): Unable to load dynamic library './php_gd2.dll' - このアプリケーションの実行に必要なライブラリ ファイルのうちの 1 つが見つかりません。」
     ⇒ extension_dir = ./ -> extension_dir = C:\php\extensions\


  4. hello.phtml による動作確認
     以下の3行からなる hello.phtml ファイルを作成し(ファイル名は hello.phpでもよいが)、ドキュメントルート下に置く。
    	<HTML><BODY>
    	<?php print "Hello, PHP!\n"; ?>
    	</BODY></HTML>
    
     ブラウザから http://127.0.0.1/hello.phtml にアクセスし、「Hello, PHP!」と表示されれば正常動作している。

     その他に phpinfo.php という名前で以下の内容のファイルをドキュメントルート下に作っておくと、http://127.0.0.1/phpinfo.php で動作や設定の確認に使える。
     <?php phpinfo(); ?>

    (注) Win9xで ODBC32.DLL がみつからないというエラーになるときがあるが、Microsoft Data Access Components (MDAC) 2.6 RTM (2.60.6526.3) 日本語版 をインストールすればよい。


  5. PHPスクリプトからメール送信する

     PHPにはメール送信用の mail()、mb_send_mail()関数がある。これらを使うには、php.iniで SMTP と sendmail_from を設定する。
     SMTPにはスクリプトが設置されたホストからみてメール送信が可能な SMTPサーバ、あるいは SMTPゲートウェイのホスト名/IPアドレスを設定する(Outlook Express のSMTP設定と基本的に同じ)。sendmail_from にはその SMTPサーバでのメールアドレスを記述する。例えば Niftyの場合は以下の要領で設定する。

    ----------------------------------
    [mail function]
    ; For Win32 only.
    SMTP = smtp.nifty.com

    ; For Win32 only.
    sendmail_from = abc01234@nifty.com
    ----------------------------------

    メール送信PHPスクリプトとしては例えば以下の「Webメーラー」が使える。
     http://php.s3.to/net/#mail

    スクリプトの中程の
    //-----------メイン
    の下 5行に設定個所がある。dataフォルダの作成、Webサーバのホスト名/IPアドレスの設定($myhost)などを適切に変更すること。

    また、このスクリプトはコードが Shift-JIS なので、php.iniの中で
     mbstring.internal_encoding = EUC-JP
    と設定していると、送信したメール内容に日本語が含まれていると、ブラウザへの確認表示が正しく表示されない(送信されたメール自体は正常に受信される)。そのため、スクリプト(webmailb.php)の最初の方に
     mb_internal_encoding("SJIS");
    の一行を追加しておくとブラウザの表示も正常になる(本来はSJIS だが Shift_JIS でも動作した)。

    実際にこのスクリプトを使ってみると To: が任意に設定できてしまうので、不正使用されないためには To: を固定し hidden にするなどの修正が必要であろう。


  6. PHPでファイルをアップロードする

    PHP で move_uploaded_file 関数を使えばファイルのアップロードが可能である。
    アップロード用スクリプトとしては例えば、レッツPHP の PHPぁぷろだ がある。

    アップロード可能な最大ファイルサイズを例えば 20MB にするには、
    スクリプトと php.ini の設定変更が必要である。

    (1) FORM の中を以下のように変更する。
     <input type="hidden" name="MAX_FILE_SIZE" value="20971520">
    ファイルサイズは Byte 単位の数値である(= 20*1024*1024)。

    「PHPぁぷろだ」では以下の個所が該当する。
     $limitk = 20480; //アップロード制限(KB キロバイト)
     $limitb = $limitk * 1024;
     <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="'.$limitb.'">

    (2) php.iniの中を 2箇所変更する。
     post_max_size = 20M
     upload_max_filesize = 20M
    もし、それでも以下のようなメッセージ
     Fatal error: Maximum execution time of 60 seconds exceeded in xx on line xx
    が出てタイムアウト(時間切れ)になるようなら、php.iniで以下の 2箇所を
     max_execution_time = 30
     max_input_time = 60
    に大きく(例えばどちらも 300秒に)変更してみる。


  7. MySQLを使う
     この項は書き直したので こちら をどうぞ
    (単に PHPのスクリプトを動かしたいだけなら MySQLをインストールする必要はない)


  8. PHPLIBを使ってみる
     PHP3の頃の遺物かもしれませんが、AN HTTPDで使えるようにするための メモ を作りました。コメントページも参考に。


  9. 関連情報へのリンク
     PHP日本語ページ
     日本PHPユーザ会
     PHPマニュアル(日本語版)
     PHP メーリングリストの全文検索
     PHP4徹底攻略改訂版のPDFファイル
     PHP基礎・中級・応用
     レッツPHP!
     PHP SAMPLES & TIPS
     PHP Dream


作成:いと,mailto:gfh05223@nifty.com