2013-05-27 3 views
0

Я пытаюсь написать часть PHP-кода с картой zend. I`m с помощью zend_http_client.The код работает случайным образом я имею в виду, это прекрасно работает иногда, а иногда и получить пустую страницу и эту ошибку из Apache журнала ошибок:php zend framework http client error

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

Где проблема?

ответ

2

Проблема может быть не связана с вашим методом.

Вы открываете много файлов и не закрываете их (подсчет сокетов также открывается в файл). Сам адаптер сокета имеет конфигурацию, называемую persistent, для настройки повторного использования TCP используется false.

Попытайтесь проверить, правильно ли уничтожен ваш клиент http в конце использования и не упоминается в другом месте вашего кода (что предотвращает очистку сборщика мусора).

Подробнее:

Проверьте пределы с ulimit -aH (предел максимального для числа открытых файлов)

Там некоторые номера тоже в /etc/security/limits.conf

soft nofile 1024 < - прогр.лимит

hard nofile 65535 < - Жесткий предел

Вы можете увеличить ulimit на ulimit -n 65535 и echo 65535 > /proc/sys/fs/file-max, чтобы установить более высокое значение, но это сильно обескуражено.

Чтобы установить это permamently в /etc/sysctl.conf установить fs.file-max=65535

+0

в моем '/ и т.д./безопасность/limits.conf' значение равно' * - 65535' и '/ Proc/SYS/фс/файл-max' is' 394882'! – Abadis

+0

, пожалуйста, проверьте, правильно ли уничтожен клиентский объект http в конце его использования. –

+0

Как я могу это сделать? – Abadis