[PHP-users 34663] Re: php.ini がopenされているのに読み込まれない[原因判明]

大瀧保広 y.ohtaki @ mx.ibaraki.ac.jp
2009年 7月 24日 (金) 09:00:33 JST


こんにちは、大瀧です。

ようやく何が起きていたのか判明しました。

Solaris の fopen の仕様に引っかかっていました。
32bitアプリでは255より大きいファイルディスクリプタでは
ファイルにアクセスできないようです。
(以下、fopen のマニュアルからの該当部分の抜粋)

	Normally, 32-bit applications return an  EMFILE  error  when
	attempting  to  associate a stream with a file accessed by a
	file descriptor with a value greater than 255. If  the  last
	character  of mode is F, 32-bit applications will be allowed
	to associate a  stream  with  a  file  accessed  by  a  file
	descriptor  with  a  value  greater than 255. 

open は成功してるのに、fopenがエラーになってたのですね。

(最終的にfopenに渡る)モードを"r" から "rF"に直して歩くか、
64bitアプリとしてビルドする(PHP? Apache?)ことになりそうです。


On 2009/07/23, at 11:34, 大瀧 保広 wrote:

> こんにちは、大瀧です.
>
> 表題の件ですが、ちょっと進展しました。
>
> その後、実稼動環境とは別の場所で
> 状況が再現できる環境が手に入ったので、
> 原因の切り分けをじっくりと行うことができました。
>
> その結果,virtualhostの設定数がある一定数を超えると
> この症状が発生することがわかりました。
>
> システムコールのトレース結果をみると、
> 症状が出ない(php.iniが読み込めている)ときには、
> 	open("/usr/local/apache2/php/php.ini", O_RDONLY) 
> で返っているファイルディスクリプタは 254以下、
> 読み込まないときには,256以上が返っています。
>
> ファイルディスクリプタの値が256以上であっても、
> 他のファイルの読み込みは問題なく行われていますので、
> php.ini を読み込む周辺のコードが怪しそうです。
>
> 以上、経過報告でした。
>
> On 2009/07/09, at 13:21, 大瀧 保広 wrote:
>
>> こんにちは、大瀧と申します.
>>
>> Solaris 10 (i386) + Apache 2.0.63 + PHP5.2.10 な環境で
>> バーチャルホスティングサービスを提供しています。
>> mod_php のときだけ php.ini が読み込まれないという現象が起きており、
>> 修正の糸口が見つけられず、困っています。
>>
>>
>> 以下、確認したことです。
>>
>> php の configure command 
>>
>> './configure' '--with-apxs2=/usr/local/apache2/bin/apxs' '--enable-zend-multibyte' '--enable-mbstring=shared' 
>> '--enable-mbregex' '--with-libxml-dir=/opt/csw' '--with-iconv-dir=/opt/csw/lib' '--with-gd' '--with-jpeg-dir=shared' 
>> '--with-zlib-dir=shared' '--with-config-file-path=/usr/local/apache2/php'
>>
>> CLI版のphpで php -i した場合
>> 	Configuration File (php.ini) Path => /usr/local/apache2/php
>> 	Loaded Configuration File => /usr/local/apache2/php/php.ini
>>
>> mod_phpのほうでphpinfo() を表示させると
>> 	Configuration File (php.ini) Path /usr/local/apache2/php 
>> 	Loaded Configuration File (none)
>>
>> apache (httpd)に対してtruss コマンドでシステムコールをトレースしてみると、
>>
>> open("./php-apache2handler.ini", O_RDONLY)      Err#2 ENOENT
>> open("/usr/local/apache2/php/php-apache2handler.ini", O_RDONLY)                     Err#2 ENOENT
>> open("./php.ini", O_RDONLY)                     Err#2 ENOENT
>> open("/usr/local/apache2/php/php.ini", O_RDONLY) = 533
>> close(533)                                      = 0
>> ...
>>
>> となっており、ファイルディスクリプタが取得できているにもかかわらず、
>> 一度もreadしないまま、closeしていることがわかります。
>>
>>
>> このような現象が起きる原因として、何が考えられるでしょうか?
>>
>> よろしくお願い致します.
>>
>> _______________________________________________
>> PHP-users mailing list  PHP-users @ php.gr.jp
>> http://ml.php.gr.jp/mailman/listinfo/php-users
>> PHP初心者のためのページ - 質問する前にはこちらをお読みください
>> http://oldwww.php.gr.jp/php/novice.php3
>
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3




PHP-users メーリングリストの案内