[PHP-users 23477]DBコネクションを切断してもFDが解放されません

V l i9niitaka @ hotmail.com
2004年 10月 12日 (火) 11:56:39 JST


はじめまして。新原と申します。

PHPを初めてまだ二ヶ月の初心者ですが、件名の件で困っています。

・環境
White Box Enterprize Linux
php-4.3.9
apache_1.3.31
Oracle 9.2.0.4

・症状
セッションデータをDBに格納する仕組みでアプリケーションを作成しているのです
が、
しばらく動かしていると、ファイルにログを書き出す箇所(ほぼ全箇所)で

  failed to open stream: Too many open files ・・・

と、

  DB Error: connect failed
  メッセージ:データベースへの接続に失敗しました。

というエラーが頻繁に発生するようになりました。

apache を再起動すると、暫くは出なくなるので、FDの問題かな?と調べてみたとこ
ろ
割り当てている容量に問題はありませんが、一画面遷移ごとに、
画面毎に決まった数だけFDの数が増加しており、FDの残量が一定の値を下回ると
上記症状が発生することが分かりました。

cat /proc/sys/fs/file-nr
5081    2907    65536
cat /proc/sys/fs/file-nr
5081    2903    65536
cat /proc/sys/fs/file-nr
5081    2897    65536
cat /proc/sys/fs/file-nr
5081    2893    65536

さらにどこでその数が増加しているか調査したところ、
DBコネクションを取得した際に2増加しますが、
コネクションを切断してもその数が減らないことが分かりました。
その時に使用した試験プログラムは以下のものです(長くてすいません)。

<http://www.pat.hi-ho.ne.jp/dimension/inst/inst_unix_dso_430.shtml>
より利用させて頂いています。

<?php
    // Oracleとの接続
    $conn = OCILogon("oracle", "oracle", "tnsname");

    // SQL文のparse
    $stmt = OCIParse($conn,"select * from hoge_tbl ");

    // SQL文の実行
    OCIExecute($stmt);
    $ncols = OCINumCols($stmt);

    echo "<TABLE BORDER='1'>";
    echo "<TR>";
    for ( $i = 1; $i <= $ncols; $i++ ) {
        $column_name  = OCIColumnName($stmt,$i);
        echo "<TH>" . $column_name . "</TH>";
    }
    echo "</TR>";

    // データのFetch
    while(OCIFetch($stmt))
    {
        echo "<TR>";
        for ( $i = 1; $i <= $ncols; $i++ ) {
            $column_name  = OCIColumnName($stmt,$i);

            // データの表示
            echo "<TD>" . OCIResult($stmt, $column_name) . "</TD>";
        }
        echo "</TR>";
    }

    echo "</TABLE>";

    // リソースの解放
    OCIFreeStatement($stmt);

    // Oracleから切断
    OCILogoff($conn);
?>

この他にも
  DB_oci8_2::connect_OCINLogin(dsn);
  DB::connect(dsn);
で試験してみましたが、結果は同様でFDが2増加したままでした。

当初 php-4.3.8 だったので、php-4.3.9 に変更してみたのですが、症状は変わりま
せん。

私なりに考えてみましたが、この原因が
  ・PHP自体のバグ
  ・Apache or Oracle との連携に不具合がある
  ・調査 or 試験 or そもそも考え方が違う
  ・php.ini 等の設定がおかしい ...etc
と、何にあるのかわかりません。

そもそもサーバのメンテナンス自体が初心者の為、今の考え方が合っているかも
不安な状態です。

同じような現象に合われた方、何か解決方法、問題点をご存じの方、
助言よろしくお願いします。

_________________________________________________________________
楽しい絵文字でココロ伝わるメッセンジャー http://messenger.msn.co.jp/ 



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