У меня есть следующий очень простой 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

0
Christian 5 Июл 2015 в 11:20
Прочитайте эту ссылку php.net/manual/en/curl.examples-basic.php
 – 
Manoj Kushwaha
5 Июл 2015 в 11:22
Не могли бы вы быть немного точнее? Не могли бы вы указать, на что на этой странице вы ссылаетесь? Так почему эта страница актуальна здесь?
 – 
arkascha
5 Июл 2015 в 11:23
Я предлагаю вам взглянуть на файл журнала ошибок http-серверов...
 – 
arkascha
5 Июл 2015 в 11:24
Вы уверены, что хотите использовать $content дважды? это не имеет смысла. проверьте curl_error после выполнения. Он может содержать ошибку, которую вы ищете.
 – 
Jigar
5 Июл 2015 в 11:25
Вы, ребята, хотя бы потрудились прочитать вопрос? ОП объяснил это!
 – 
arkascha
5 Июл 2015 в 11:25

2 ответа

У меня была похожая проблема раньше, и я решил ее с помощью решения, приведенного здесь. Поверх вашего файла добавьте строку ниже и проверьте ее еще раз, пожалуйста.

<?php
ini_set('zend.enable_gc', 0);
....
....
0
BentCoder 5 Июл 2015 в 13:38
К сожалению, без изменений.
 – 
Christian
5 Июл 2015 в 14:23

Я только что прошел через нечто подобное. Соединение 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.)

0
JoLoCo 3 Сен 2015 в 21:44