2013-04-10 6 views
3

Я пишу скрипт PHP CLI для клиента, который работает на общем хостинге. Он регистрирует в файл, используя простую функцию, как:Не удалось открыть поток: Слишком много открытых файлов

function log_entry($msg) { 
    global $log_file, $log_handle; 
    $msg = "[".date('Y-m-d H:i:s')."] ".$msg."\n"; 
    echo $msg; 
    $log_handle = fopen($log_file, 'a'); 
    fwrite($log_handle, $msg); 
} 

И я получаю эту ошибку:

PHP Warning: fopen(./logs/sync.20130410.log) 
[<a href='function.fopen'>function.fopen</a>]: failed to open stream: 
Too many open files in ./functions.php on line 61 

Я думал, что проблема с использованием той же ручкой, так что я изменил его:

function log_entry($msg) { 
    global $log_file; 
    $msg = "[".date('Y-m-d H:i:s')."] ".$msg."\n"; 
    echo $msg; 
    $log_handle = fopen($log_file, 'a'); 
    fwrite($log_handle, $msg); 
    fclose($log_handle); 
} 

Но это не сработало. Я всегда получаю ошибку в одной строке журнала. Когда я делаю ulimit -n, я получаю 1024, но это не должно быть проблемой, потому что я никогда не открываю больше одного файла. Идеи?

+0

Вы, мой бег в лимит дескриптора файла с вашим хостинговым провайдером – Zak

+0

Но разве я не использую только один за раз с обеими функциями? Первый должен использовать только один через полное исполнение, а второй должен использовать один на строку ... или он работает по-другому? – Mauro

+0

http://serverfault.com/questions/195334/apache-crashes-every-night-due-to-too-many-open-files – zod

ответ

6

Пятнистый вопрос. Я отвечаю на это на всякий случай, если кто-то из Google по той же причине, но я знаю, что этот ответ не подразумевался в вопросе.

Я использую клиент API BigCommerce и выясняет, что они открывают дескриптор для каждого запроса и приводят к сбою моего сценария. Вот как я установил его:

BigCommerce/API/connection.php: 354-365:

public function put($url, $body) 
{ 
    $this->addHeader('Content-Type', $this->getContentType()); 

    if (!is_string($body)) { 
     $body = json_encode($body); 
    } 

    $this->initializeRequest(); 
    $handle = tmpfile(); 
    fwrite($handle, $body); 
    fseek($handle, 0); 
    curl_setopt($this->curl, CURLOPT_INFILE, $handle); 
    curl_setopt($this->curl, CURLOPT_INFILESIZE, strlen($body)); 

    curl_setopt($this->curl, CURLOPT_URL, $url); 
    curl_setopt($this->curl, CURLOPT_PUT, true); 
    curl_exec($this->curl); 
    fclose($handle); // Added this line 

    return $this->handleResponse(); 
} 

(Добавлена ​​fclose($handle);) линии.

Смежные вопросы