指定されたモジュールが見つからないとか言われる

Windows上に開発環境なんて作ったこと無かったので微妙にはまった。
PHP自体はWindowsでもコマンドライン上で使ってはいたんだけど、Apache入れてMySQL入れて、なんてのはLinuxでやるもんなぁ。

構成

各インストール場所はこんな感じ。C:\Program Filesとかキライ><


Apacheが二重になってるのは、ひとつめがApache Software Foundationのつもりだから。この中にはhttpdApache以外にもAntとかJMeterとかも入れている。
MySQLが二重になってるのは、デフォルトでもC:\Program Files\MySQL\MySQL Server 5.0と二重になってるのを尊重したのと、今後5.1とかも同居するかもしれないから。
PHPだけ5とかついてないのは、4とか使う気ないし5.3とか6のことなんて気にしてないから。


Apache

(略)
LoadModule php5_module C:/php/php5apache2_2.dll

PHPIniDir C:/php
AddType application/x-httpd-php .php
DirectoryIndex index.php index.html
(略)

PHP

(略)
extension_dir = "C:\php\ext"
extension=php_mbstring.dll
extension=php_mcrypt.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_pdo.dll
extension=php_pdo_mysql.dll
extension=php_pdo_sqlite.dll
extension=php_sqlite.dll
(略)

extensionがロードできない

上記の設定でApacheを起動すると一見正常に立ち上がるんだけど、PHPのログを有効にしておくと下のようなエラーが出ていることに気づいた。

[01-Apr-2009 22:18:56] PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\php\ext\php_mysql.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0
[01-Apr-2009 22:18:56] PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\php\ext\php_mysqli.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0
[01-Apr-2009 22:18:56] PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\php\ext\php_pdo_mysql.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0
[01-Apr-2009 22:18:56] PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\php\ext\php_mcrypt.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0

phpinfo()の結果を見てもMySQLmcryptが出てこない。しかしmbstringとsqliteは出てくる。
読み込まれているphp.iniはC:\php\php.iniになってるし、extension_dirは何度確認しても間違ってないし、mbstringとsqliteはロードされてるわけだし、何が原因かさっぱりわからんかった。

実はlibなんちゃらが見つからない問題

ログメッセージにすっかり騙されてしまったが、実はこれはphp_mysql.dllが見つからないんじゃなくて、php_mysql.dllがロードするlibmysql.dllが見つからないという罠だった。
このlibmysql.dllとかlibmcrypt.dllはC:\phpにあるんだけど、どうもそれを見つけられないらしい。


というわけで、普通はこの手のDLLはC:\WINDOWS\System32に放り込めばいいんだろうけど、言語のランタイムやアーカイバのDLLほど一般的でもないものをSystem32に入れるのは好きじゃないのでApacheに読み込んでもらってみた。
(同様の理由でphp.iniもC:\WINDOWSとかには入れない。)

LoadFile C:/php/libmysql.dll
LoadFile C:/php/libpq.dll
LoadFile C:/php/libmcrypt.dll

こんな感じであらかじめ読み込ませてみたら無事に動くようになった。


設定ファイルに書くのだせぇ、っていうのなら、たぶんApacheのbinディレクトリにlibmysql.dllとかを突っ込むのでもいけると思う。

PATHが通っていれば見つけてくれる

自宅に帰って同じことをやってみると何故か上記のような工作をしなくてもモジュールが正常に読み込まれた!
何なの? 何が違うの?


調べてみたらシステム環境変数のPATHにC:\phpが入っていた。
以前からコマンドラインでは使っているのでパスが通っているのは当たり前なんだけど、会社のPCはユーザ環境変数のPATHにC:\phpを設定してあるんだと思う。
普通にインストールしたApacheはサービスとして動くのでユーザの環境変数ではなくてシステムの環境変数しか見てないんじゃないかと(ユーザもSYSTEMになってるし)。
たぶんユーザの環境変数に通した状態で、サービスじゃなくて普通にコマンドで起動すればいけるかも。そんな面倒なことしないけど。


PATHは実行ファイル以外にもライブラリのロードにも影響があるってことを忘れていた。