[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 メーリングリストの案内