0

Zend フレームワークを使用して php コードを作成しようとしています。私は zend_http_client を使用しています。コードはランダムに動作します!つまり、正常に動作することもあれば、空のページが表示されることもあり、Apache エラー ログから次のエラーが表示されます。

[Mon May 27 16:46:37 2013] [error] [client 4.4.4.4] PHP Warning:  require_once(/var/www/my.somesite.com/library/Zend/Http/Client/Adapter/Exception.php): failed to open stream: Too many open files in /var/www/my.somesite.com/library/Zend/Http/Client/Adapter/Socket.php on line 222
[Mon May 27 16:46:37 2013] [error] [client 4.4.4.4] PHP Fatal error:  require_once(): Failed opening required 'Zend/Http/Client/Adapter/Exception.php' (include_path='/var/www/my.somesite.com/application/../library:../application/models:.:/usr/share/php:/usr/share/pear') in /var/www/my.somesite.com/library/Zend/Http/Client/Adapter/Socket.php on line 222
[Mon May 27 16:46:37 2013] [error] [client 4.4.4.4] PHP Fatal error:  Undefined class constant 'PRIMARY_TYPE_NUM' in /var/www/my.somesite.com/library/Zend/Session/SaveHandler/DbTable.php on line 522

このようなphpコードsth:

    public function Request($server_method, $params_arr) {
    $httpClient = new Zend_Http_Client;
    $httpClient->setConfig(array('timeout' => '900'));
    $client = new Zend_XmlRpc_Client ( Zend_Registry::getInstance ()->config->ibs->xmlrpc_url ,$httpClient);
    $request = new Zend_XmlRpc_Request ( );
    $response = new Zend_XmlRpc_Response ( );
    $request->setMethod ( $server_method );
    $request->setParams ( array ($params_arr ) );
    $client->doRequest ( $request, $response );
    if ($response->isFault ()) {
        $fault = $response->getFault ();
        //echo '<pre>' . $fault->getCode () . '' . $fault->getMessage () . '</pre>';
        $this->response = array (FALSE, $fault->getMessage () );
        return array (FALSE, $fault->getMessage () );
    }

    //return $response;
    $this->response = array (TRUE, $response->getReturnValue () );
    return array (TRUE, $response->getReturnValue () );
    //var_dump($response->getReturnValue());
}

問題はどこだ ?

4

1 に答える 1

2

問題は、メソッド自体に関連していない可能性があります。

あなたは多くのファイルを開いていますが、それらを閉じていません(開いているファイルとしてのソケットもカウントされます)。ソケット アダプター自体には、TCP の再利用を防ぐようpersistentに設定された という構成があります。false

http クライアントが使用終了時に適切に破棄され、コードの別の場所で参照されていないかどうかを確認してください (これにより、ガベージ コレクターのクリーニングが妨げられます)。

より詳しい情報:

ulimit -aH(開いているファイル数の最大制限)で制限を確認してください

数字も入ってる/etc/security/limits.conf

soft nofile 1024<- ソフトリミット

hard nofile 65535<- ハードリミット

ulimit を増やしてより高い値を設定することもできますulimit -n 65535echo 65535 > /proc/sys/fs/file-max、これはお勧めできません。

これを永続的に設定するには、 /etc/sysctl.confsetfs.file-max=65535

于 2013-05-27T14:02:10.343 に答える