Apache上でPHPが環境変数を認識できない
2007.05.08 / develop
ここ数日、PHPの開発でかなりハマってたことがありました。ハマり内容はこんな感じ。
- ある共有ライブラリhoge.soをphp.iniのextension_dirに設置
- php.iniにextension=hoge.soを指定
- 環境変数LD_LIBRARY_PATHにhoge.soのフルパスを指定
- ターミナルからhoge.soを必要とするスクリプトfoo.phpを実行(php foo.php)すると、正常に動作
- でも、Webブラウザからのアクセスによる実行だと、hoge.soが読み込まれず、エラーが発生
要するに、Apacheの実行ユーザとして、環境変数LD_LIBRARY_PATHが読み込めていないor認識できていない、という問題です。これApacheの実行ユーザを「apache」以外の別ユーザ、たとえばkatsumaにした上で、katsumaユーザでターミナルから実行しても正常動作で、あくまでもブラウザから実行するとNG、という現象だったので、もう打つ手無し、、でした。しかも、google検索してもなかなかそれっぽい記事が出てこなかったので、あきらめかけていた。。のですが、そんなときCTOの助言もあり、何とか回避することができました。
仕掛けはいたってカンタンで、apache(httpd)の起動スクリプトに環境変数を認識させるように明示的に記してあげます。たとえばFedora5なら/etc/init.d/httpd の中で
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/foo/var/hoge.so
などを書いてあげて、ApacheをrestartしてあげればOKです。なぜパスが認識できていなかったのかは未だ原因不明なのですが、とりあえず起動のタイミングで再設定してあげればOKなようです。(原因は別途、調査中)
ちなみに、PHP側でロードできている環境変数を表示する場合は、
$_ENV['hoge']または、phpinfo()で表示される内容のPHP Variablesセクションの中で$_ENV[‘hoge’]がちゃんと認識されているか、または意図した値が入っているかどうかで確認できます。(できます、とか言いつつも正直今更ながら、今回初めて知りました。。)ここで認識できていない環境変数は、上記の通りhttpdの起動スクリプトに直接再認識させるように記述すればOKだと思います。
しかし、何だかんだで2日ほど時間費やした割には、単純な方法で解決できるものです。。まー日々勉強ですねぇ。