[PHP-users 34516] parse_ini_fileが突然失敗するようになる

榮水貴行 t-eimizu @ aim.ac
2009年 4月 15日 (水) 16:08:23 JST


こんにちは、榮水です。

以下の環境で動作しているアプリケーションがあるのですが、
不可解な事象が発生して困っております。
何かご存知のことがあればご教授いただけないでしょうか。
長文で失礼いたします。

<環境>
・Solaris 10
・PHP 4.3.11
・Sun Java Web Server 6.1 SP4
・Oracle Client 10.2.0.1

※ログローテーションのために、
 Webサーバは1日に1回再起動しています。

<発生している事象>
再起動した後しばらくは、正常に稼動しているのですが、
しばらく使っていると、以下のようなエラーを出して、
parse_ini_fileが失敗するようになります。

Cannot open 'xxxxx.ini' for reading

parse_ini_file自体は、リクエストを処理するたびに
ほぼ確実に実行される箇所にあります。

<原因の推測>
再起動後に、正常に動作する期間があることから、
ファイルの有無・パーミッション等の問題ではないと考えられます。

おそらくは、parse_ini_fileが中で使用している、Cのfopen()が
正しいファイルポインタを返せていないことが直接の原因だと思われます。

手元のfopen(3C)によれば、関連しそうなエラーは以下のものです。
(最後の2つは関係なさそうですが)

EMFILE
      There are OPEN_MAX file descriptors currently open  in
      the calling process.
      (OPEN_MAX個のファイル記述子が同じプロセス内に存在している。)

ENFILE
      The maximum allowable number  of  files  is  currently
      open in the system.
      (システムで許される最大数のファイルが現在オープンされている。)

EMFILE
      The number of streams currently open  in  the  calling
      process is either FOPEN_MAX or STREAM_MAX.
      (現在のプロセスが開いているストリームの数がFOPEN_MAX
      またはSTREAM_MAXを超えている。)

EOVERFLOW
      The current value  of  the  file  position  cannot  be
      represented correctly in an object of type fpos_t.
      (ファイル内の位置を示す値が、fpos_t型のオブジェクトにおいて
      正しく表現できない値になっている。)

EINTR A signal was caught during the execution of fopen().
      (fopen()の実行中にシグナルを捕捉した。)

<試したこと>
・PHP5にあげてみる。
 ⇒PHP4にどっぷりつかったソースであったため、
  直ちに切り替えることが困難と判断しました。

・ociplogon()を使用する。
 ⇒過去の投稿にならい、ociplogon()にしましたが、
  状況は改善しませんでした。

・ulimit -n 4096 で、ファイルディスクリプタの上限をあげてみる。
 ⇒発生直後のプロセスを lsof コマンドで見たところ 297 行しか
  出力されませんでした。

・Webサーバのプロセス数を増やしてみる
 ⇒今まで1プロセスで待ち受けて処理していたところを、
  8プロセスまで増やして待ち受けるようにしてみました。
  これについては、現在結果観測中です。

以上です。

なぜparse_ini_fileが失敗するようになってしまうのか、
現象を止める、あるいは回避するにはどうすればよいのか、
皆様のお知恵をお借りできればと思います。

よろしくお願いいたします。

*=================================*
株式会社エイム
榮水 貴行
Mail: t-eimizu @ aim.ac
*=================================*


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