2009年7月24日

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

こんにちは、大瀧です。

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

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@xxxxx
>> http://ml.php.gr.jp/mailman/listinfo/php-users
>> PHP初心者のためのページ - 質問する前にはこちらをお読みください
>> http://oldwww.php.gr.jp/php/novice.php3
>
> _______________________________________________
> PHP-users mailing list PHP-users@xxxxx
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3


_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3


投稿者 xml-rpc : 2009年7月24日 09:00
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/86915
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。