У меня есть следующий очень простой PHP-скрипт, который использует cURL для загрузки веб-страницы и ее отображения.
<?php
$ch = curl_init("http://www.reddit.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$content = "Hello, World!";
$content = curl_exec($ch);
curl_close($ch);
echo $content;
?>
На моей локальной машине это работает отлично, но не на моей серверной машине. Здесь я получаю сообщение об ошибке «Соединение было сброшено» в Firefox. Строка, вызывающая проблемы, кажется $content = curl_exec($ch);
. Если я прокомментирую эту строку, я увижу Hello, World!
на обеих машинах.
При вызове phpinfo()
на обеих машинах секция cURL
выглядит очень похоже. В чем тут может быть проблема, что на одной машине работает, а на другой нет. По сути, оба работают под управлением Ubuntu 14.04 с Apache 2 и PHP 5. Какие конфигурации или разрешения могут отличаться. Я немного в недоумении, где искать.
РЕДАКТИРОВАТЬ: Как предложил arkascha, я проверил файл Apache error.log
. И действительно, если я увижу следующую ошибку, как только выполню команду curl_exec
:
[core:notice] [pid 28267] AH00051: child pid 28274 exit signal Segmentation fault (11), possible coredump in /etc/apache2
2 ответа
У меня была похожая проблема раньше, и я решил ее с помощью решения, приведенного здесь. Поверх вашего файла добавьте строку ниже и проверьте ее еще раз, пожалуйста.
<?php
ini_set('zend.enable_gc', 0);
....
....
Я только что прошел через нечто подобное. Соединение CURL между двумя серверами работало большую часть времени, но сбоило примерно один раз из пяти.
При сбое Firefox сообщал, что «соединение было сброшено», а Safari сообщал мне, что «сервер неожиданно разорвал соединение». Журнал ошибок Apache покажет exit signal Segmentation fault (11)
.
Добавив трассировки, я обнаружил, что на самом деле причиной сбоя была функция curl_close
, а не функция curl_exec
, которая на самом деле работала нормально (и результаты которой появлялись в моих журналах).
В конце концов, я точно определил эту строку в своем коде...
curl_setopt($curlSession, CURLOPT_VERBOSE, true);
... который я использовал для вывода необработанных данных сеанса CURL в файл журнала для целей отладки. Поскольку я закомментировал эту строку, ошибка перестала возникать.
Таким образом, кажется, что использование CURLOPT_VERBOSE может привести к сбою CURL и забрать с собой PHP/Apache. (Я также видел дискуссию программиста CPP, говорящего то же самое о CURL на CPP.)
Похожие вопросы
Связанные вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.
$content
дважды? это не имеет смысла. проверьтеcurl_error
после выполнения. Он может содержать ошибку, которую вы ищете.