Abadis
Abadis

Reputation: 2841

php zend framework http client error

I am trying to write a piece of php code with zend framework. I`m using zend_http_client.The code works randomly!I mean , It works fine sometimes and sometimes get an empty page and this error from Apache error log :

[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 code sth like this :

    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());
}

Where is the problem ?

Upvotes: 0

Views: 1446

Answers (1)

Paulo H.
Paulo H.

Reputation: 1258

The problem may be not related to your method itself.

You are opening many files and not closing them (a socket count as a file open too). The socket adapter itself has a configuration called persistent, set false to prevent TCP reuse.

Try to check if your http client is properly destroyed at end of use and is not refered in another place of your code (that prevents garbage collector cleaning).

More info:

Check the limits with ulimit -aH (max limit for number of open files)

There some numbers too in /etc/security/limits.conf

soft nofile 1024 <- Soft limit

hard nofile 65535 <- Hard limit

You could increase ulimit by ulimit -n 65535 and echo 65535 > /proc/sys/fs/file-max to set a higher value, but this is strongly discouraged.

To set this permamently, in /etc/sysctl.conf set fs.file-max=65535

Upvotes: 2

Related Questions