Проблема PHP Curl POST, из-за которой PHP использует 100% ЦП

Я пытаюсь загрузить данные с помощью POST на свой веб-сервер, но иногда cURL просто останавливается и заставляет PHP бесконечно использовать 100% ЦП.

Я использую код ниже.

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $URL);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)');
curl_setopt($curl, CURLOPT_HEADER, true);
$page = curl_exec($curl);
curl_close($curl);

Любое понимание того, что вызывает или как отследить эту проблему, было бы здорово.


person DramaGirl    schedule 27.11.2009    source источник
comment
Ты уверен, что он висит именно там? Например, можете ли вы напечатать что-то до curl_exec и после curl_exec и никогда не увидеть второй отпечаток?   -  person Lucas Oman    schedule 27.11.2009
comment
Какие данные вы публикуете? Что делает принимающий скрипт с данными? Какой сервер тормозит, отправляющий или принимающий?   -  person Pekka    schedule 27.11.2009
comment
Я запускал этот код около 15 раз на своей машине. Переменная $page отображается просто отлично.   -  person MeLight    schedule 27.11.2009
comment
Это происходит случайным образом, иногда это работает, а иногда это происходит. Я загружаю файлы по почте на свой веб-сервер через другой сервер. Проблема возникает на сервере, на котором выполняется сценарий для загрузки. После загрузки все, что делает сценарий, это проверяет, был ли он успешным. Когда возникает эта проблема, я замечаю, что с помощью параметра CURL_VERBOSE он не проверял, правильно ли загружается файл, поэтому я предполагаю, что это происходит именно здесь. Я запускаю скрипт через cron каждые 10 минут, и большую часть времени он работает, но когда это происходит, процесс PHP съедает 100% ЦП и остается там, пока я не убью процесс.   -  person DramaGirl    schedule 27.11.2009


Ответы (4)


Если это действительно «вызов» curl, который зависает и загружает ЦП на 100%, то это ошибка curl, и вам, вероятно, следует подумать об обновлении libcurl.

person Daniel Stenberg    schedule 27.11.2009
comment
Есть ли способ обновить libcurl без перекомпиляции PHP? Я использую Yum для установки, поэтому компиляция из исходного кода может испортить все остальное. - person DramaGirl; 28.11.2009
comment
7.12.1 действительно ДРЕВНЯЯ, поэтому вам действительно следует обновить ее. И у вас должна быть возможность обновиться без перекомпиляции, но это совсем другая тема... - person Daniel Stenberg; 30.11.2009

Можете ли вы определить, связано ли это с конкретным файлом? Возможно, есть что-то, связанное с кодировкой или длиной загрузки?

Моей первой мыслью было бы, по крайней мере, определить, вызывает ли проблема конкретный файл/набор файлов; запишите имена файлов (и, возможно, содержимое) и типы перед загрузкой и имя файла после ее завершения. Таким образом, вы будете точно знать, какие файлы вызывают проблему, и сможете двигаться дальше.

person jvenema    schedule 27.11.2009

Возможно, проблема в том, что вы указываете в качестве данных публикации. Не могли бы вы сделать var_dump($postdata) прямо перед вызовом cURL и опубликовать вывод здесь? cURL может зависнуть из-за проблемы с приведением типов/сериализацией, или данные вашего поста просто недействительны (и, надеюсь, мы сможем это исправить!).

person mattbasta    schedule 29.11.2009

Обновите PHP до последней версии, PHP 5.3.1.

Если проблема не устранена, а ваш сервер работает под управлением Windows, обновите его до чего-нибудь еще, в частности, до версии *NIX: дистрибутива GNU/Linux, формы BSD, SunOS и т. д.

Если проблема не устранена даже после этого или вы считаете Windows хорошей ОС для серверов [1], инструкции по отслеживанию проблемы и отправке отчета об ошибке находятся здесь: http://bugs.php.net/how-to-report.php

[1] Сама Microsoft каждый месяц должна перезагружать каждую машину за microsoft.com.

person Flavius    schedule 27.11.2009
comment
Отказ от вашей ОС из-за случайной проблемы с использованием ЦП — сумасшедшая идея. PHP отлично работает в Windows, как могут подтвердить многие люди. - person jvenema; 27.11.2009
comment
Понижение ответа, который содержит ответ на его вопрос, также не является хорошей кармой: P Что я практически сделал, так это сказал ему, где может быть ошибка, как ее исправить и / или как сообщить об этом. - person Flavius; 27.11.2009
comment
Это нонсенс. Windows также не является моим первым выбором в качестве серверной ОС, но я знаю, что существует множество прекрасно работающих PHP-сайтов, размещенных на Windows без каких-либо проблем. Предлагать перейти на *nix из-за неустановленной ошибки глупо. - person Pekka; 27.11.2009
comment
Я предлагаю попробовать код на другой ОС, чтобы определить источник ошибки: это из-за специфичной для Windows части в PHP или это вообще? Он ведет себя так же в последней версии PHP? Если да, то какие ОС. Все эти вопросы следует задать себе при создании отчета об ошибке. - person Flavius; 27.11.2009
comment
Я только что обновился до последней версии PHP, и проблема все еще существует. Я настроил процесс и получил ответ: poll([{fd=3, events=POLLOUT, revents=POLLERR|POLLHUP}], 1, 0) = 1 poll([{fd=3, events=POLLOUT, revents=POLLERR|POLLHUP}], 1, 1000) = 1 опрос([{fd=3, events=POLLOUT, revents=POLLERR|POLLHUP}], 1, 0) = 1 опрос([{fd=3, events= POLLOUT, revents=POLLERR|POLLHUP}], 1, 1000) = 1 poll([{fd=3, events=POLLOUT, revents=POLLERR|POLLHUP}], 1, 0) = 1 poll([{fd=3, события=POLLOUT, revents=POLLERR|POLLHUP}], 1, 1000) = 1 - person DramaGirl; 28.11.2009
comment
Можете ли вы проверить это на удаленном * NIX? Как вам сказали, для других и для меня ваш код работает. Какую ОС/версию вы используете? Попробуйте скомпилировать его с отладочной информацией, как описано в ссылке выше, и отправьте отчет об ошибке. - person Flavius; 28.11.2009
comment
Сервер, на котором я тестирую коды, - это CentOS 4.x, проблема действительно с CURL, я полагаю, я просмотрел код и вывел вывод до и после каждого вызова CURL, и он останавливается после CURL. Я использую Curl версии curl 7.12.1. - person DramaGirl; 28.11.2009