★以下のBlogの技術的内容は、 http://akihiko.shirai.as/modules/bwiki/index.php?PHPTIPS にまとめてありますので、必要な人はあとで使ってください。

ReVolutionの投稿締め切りが明日に迫ってきた。 自分の書類やその他の仕事もとっても忙しいのだが、やはり締め切り直前になって、どどっと投稿が増えてくる。 さらに、各投稿100MBというかなり贅沢な容量を設定しているにもかかわらず「アップロードできない」という問い合わせが沢山やってくる。

設定は正しいので、おそらくサーバー環境やPHPそのものの制限が関係していると思われる。簡単に言えばロードバランスを調整しなければならない。 それに、先日の日記にも書いたように、PHPの深刻なアップデートが存在する。バグフィクスもある。さくらのレンタルサーバを笑えないので、ここは設定をちまちま変えるよりは、PHPのアップデートも並行して行なうことのほうが結果としてよいと判断した。

しかしLinuxならapt-getで一発なこの手の処理だが、流れ上、お古になったWindowsサーバーの一角を借りているので、Windows的な方法でアップデートせねばならない。というか、この作業はめったにやらないので、小1時間で終わるはずの作業が、6時間コースになってしまったので、投稿システムが長時間止まってしまったことに対する免罪符もかねてナレッジを残しておくことにする。

*PHPをIISでつかう 国内のほとんどのPHPに関するドキュメントはLinux、Apache上の設定であるが、「IISで使いたい!」という要求はけっこうあるはずだと思う。開発もWindowsPCでできるし、ASPなどの資産でWindows2000 Serverなどで運用しているWebアプリケーションなどをシームレスにPHPに移行したい場合などは「ASPとPHPが同時に動くサーバ」などという夢のような環境も欲しいものだ。Apacheで動くPHPもないことはないが、PHPにIISのためのリリースがあるし、IISにはISAPIというサーバーAPIの仕組みがあるので使わない手はない。ちなみにPHPモジュールにもCOMやMSDE(データベースエンジン)、PDF作成など、Windows環境独自のDLLが揃っているので、これはこれで利点。

*インストール時の注意 古めのPHP同梱マニュアルには、c:\windows\system32にDLLを片っ端から放り込め!という手荒なインストール方法が書かれているのですが、最近の(4.4.x以降?)では、利便性から「c:\php」で利用せよとなっています。

多くの解説サイトが、上記の点を更新していないので注意が必要です。たとえばこことか。 http://y-kit.jp/saba/xp/phpsetup.htm

以下、重要なセッティング部分を引用。

   To use the ISAPI module, do the following:      * If you don’t want to perform HTTP Authentication using PHP, you        can (and should) skip this step. Under ISAPI Filters, add a new        ISAPI filter. Use PHP as the filter name, and supply a path to the        php4isapi.dll / php5isapi.dll.      * Under ‘Home Directory’, ‘Virtual Directory’, or ‘Directory’, do        the following:      * Change the Execute Permissions to ‘Scripts only’      * Click on the ‘Configuration’ button, and choose the Application        Mappings tab. Click Add and set the Executable path to the        appropriate ISAPI DLL. An example PHP 5 value is:        C:\php\php5isapi.dll Supply .php as the extension. Leave ‘Method        exclusions’ blank, and check the ‘Script engine’ checkbox. Now,        click OK a few times.      * Stop IIS completely (NET STOP iisadmin)      * Start IIS again (NET START w3svc)

   With IIS 6 (2003 Server), open up the IIS Manager, go to Web Service    Extensions, choose “Add a new Web service extension”, enter in a name    such as PHP, choose the Add button and for the value browse to either    the ISAPI file (php4isapi.dll or php5isapi.dll) or CGI (php.exe or    php-cgi.exe) then check “Set extension status to Allowed” and click    OK.

私の場合はphp4のISAPI DLLを使う方法を採用しています。アプリケーション保護レベルは以前は(exe使用の場合など)「高(分離プロセス)」にしていたのですが、いまは低でも全く問題ないです。パフォーマンスについてはけっこう違うので、ちゃんと比較したほうがいいでしょう。

上記のマニュアルをちゃんと読んでなかったおかげで「No input file specified」というエラーが出まくって時間を無駄にしました。 何がまずかったかって、isapiのDLLを「ひとつ上のフォルダ(C:\php\php4isapi.dll)」に持ってくるのを忘れたことですね…最低。

以下簡単に手順をまとめると… -古い「c:\php」を「c:\pho-4.3.0」のようにリネーム -windowsのシステムフォルダに、php.iniや関連DLLがないか探す -システム環境変数のpathに「c:\php\;」を追加 -ダウンロードしたファイルを「c:\php」に展開 -「c:\winnt\php.ini」に吟味しながら移植、ここを手を抜いてはいけない、15分もかければできる。 -コマンドプロンプトを立ち上げて「php」を実行してうまく立ち上がるかどうか -IISマネジメントコンソールを立ち上げて、既定のWebサイトの「ISAPIフィルタ」とアプリケーションの構成を「マニュアルどおり」設定する(exeを使う方法とDLLを使う方法があるがDLLを使う方法をいつも使っている)。 -一旦再起動してみる。 -phpinfoで動作確認

*php.iniはなくても動作する どうやら、php.iniは「c:\WINNT\php.ini」を優先して見に行くらしい。つまり「c:\php\php.ini」など書いても何も起きない。phpinfoは正しく表示されるが、デフォルト値のまま(例えばmailhost=localhost)。正しいphp.iniを置いてやらないことには設定が出来ないが、コピーするのではなく、「c:\WINNT\php.ini」のショートカットをデスクトップあたりに作っておくとよいと思う。で、「iisreset」で再起動。

*“No input file specified”エラー このエラーが出ると非常に長い時間はまることになる。「セキュリティだ」と力説しているサイトもあるが、一番最初に疑うべき場所は「php.ini」の記述だと思う。特にdoc_rootの設定で、「doc_root=c:\inetpub\wwwroot」とマニュアルどおりに設定した場合に発生したりする(複数の仮想ドメインで運用時)。実はこれはマニュアルにはちょこっとかいてあるが、単に「doc_root=」で解決する。

*IISでのPHP再起動 マニュアルには「net stop iisadmin」とあるがやってみたら、PHPの実行はおろか、ブラウザへの出力画面が真っ白になってしまった。「iisreset」ではどうだろうか?1コマンドで済むし、特に問題は起きたことがない。

*全ての動詞? 「GET,HEAD,POST,TRACE」に制限せよ、というマニュアルもあったが実際にはどうなんだろう? *PHPのページを表示すると真っ白になる これはどはまり。コマンドラインのPHPは動作するのに、IIS経由だと、ブラウザに何も出力されない。wgetなどで挙動を見ても、まるで何かが詰まったかのように動かない。特に設定を変えた覚えがないのに起きるので非常に困る。以下の手順を試してみて欲しい。 -c:\winnt\php.iniを一時退避 -IISマネジメントコンソールのアプリケーション構成を一旦削除 実はこれをやってもスクリプトは動作する。「アプリケーション保護」の設定が「高(分離プロセス)」になっているとphpがひっそりフリーズしていても、終了も何も出来なくなる。「iisreset」を使い、IISのサービスがうまく落ちたり上がったり出来ることを確認しながら作業を進めるべき。 -必要ならISAPIフィルタやアプリケーション動作の設定を削除 ここまでやらなくても復旧するはず。そもそも、Webアプリケーションの構成は削除して何も設定しなくてもPHPは動作するので、不確定要素をすべて引き算して、ゼロに近くしてから試していくのが早道。なお、マシンの再起動はほとんどの場合する必要がないので粘ること。

*インストールマニュアル日本語訳 http://php.s3.to/man/install.windows.manual.html

~—- *アップロードファイルサイズの上限を変更する [#j53a7d65] php.iniにて -upload_max_filesize = 150M -memory_limit = 64M      ; Maximum amount of memory a script may consume (8MB) -post_max_size = 150M

他に関係ありそうな項目として、 -max_execution_time = 30     ; Maximum execution time of each script, in seconds -max_input_time = 60 ; Maximum amount of time each script may spend parsing request data も寄与するように見えるが、実はデフォルトのままでも問題ない。 おそらくファイルアップロード中は実行処理が進んでいるのでIDLEにはならないということなのかも。 ApacheやIISのタイムアウトもデフォルトのままで問題ない。