Php перестал работать curl

Решение проблемы с работой модуля cURL на PHP 5.6.1, PHP 5.5.17 и выше (на Windows)

Те, кто использует cURL, после обновлений на 5.6.1, 5.5.17 столкнулись с тем, что модуль cURL перестал работать. Проблема с тех пор не исчезла. Даже в последней на сегодняшней момент версии PHP 5.6.4 эта проблема сохранилась.

Как узнать, работает ли у вас cURL?

Создайте php файл и скопируйте туда:

Откройте его с сервера. Если на выходе что-то вроде:

Array ( [version_number] => 468736 [age] => 3 [features] => 3997 [ssl_version_number] => 0 [version] => 7.39.0 [host] => x86_64-pc-win32 [ssl_version] => OpenSSL/1.0.1j [libz_version] => 1.2.7.3 [protocols] => Array ( [0] => dict [1] => file [2] => ftp [3] => ftps [4] => gopher [5] => http [6] => https [7] => imap [8] => imaps [9] => ldap [10] => pop3 [11] => pop3s [12] => rtsp [13] => scp [14] => sftp [15] => smtp [16] => smtps [17] => telnet [18] => tftp ) )

Значит с cURL всё в порядке, если вместо этого ошибка PHP, значит проблема существует.

Во-первых, конечно же проверьте файл php.ini, найдите там строчку

И убедитесь, что перед ней не стоит точка с запятой.

Если всё так, а cURL не работает, то можно провести ещё один тест, для подтверждения необычности ситуации. Создайте ещё один php файл с содержанием:

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

01

При этом и Apache и PHP работают как обычно.

  1. Способ первый (не кошерный). Если у вас PHP 5.6.*, то возьмите версию PHP 5.6.0, оттуда возьмите старый файл php_curl.dll и замените его вместо вашего нового из версии, например, PHP 5.6.4. Для тех, у кого PHP 5.5.17 и выше, нужно взять этот же файл из PHP 5.5.16 и также его заменить. Проблема здесь одна — найти эти старые версии. Можно, конечно, покавыряться в http://windows.php.net/downloads/snaps/php-5.6, но лично я там не нашёл того, что мне нужно. Да и само решение какое-то не совсем кошерное.
  2. Способ второй (очень быстрый, но тоже не кошерный). Из каталога PHP скопировать файл libssh2.dll в каталог Apache24bin и перезапустить Apache.
  3. Способ третий (кошерный — кошерные люди аплодируют стоя). Нужно добавить вашу PHP директорию в PATH. Как это сделать очень хорошо расписано в официальной документации.
Читайте также:  Css input not active

02

Вуаля, секция cURL на месте.

Почему так? Откуда взялась эта проблема? Ответа на этот вопрос нет, хотя уже описан механизм её возникновения.

Проблема связана, вроде, с тем, что 5.6.1 должен был выпущен с обновлённым libcurl 7.38.0. Но это доподлинно не известно, авторы PHP кивают на Apache, мол это там какие-то баги.

Механизм возникновения проблемы: если в системную PATH не включён каталог PHP, то когда служба Apache запускается, она не способна найти новый dll (libssh2.dll), который является зависимостью для php_curl.

Соответствующие баг репорты:

Fatal error: Call to undefined function curl_multi_init() in …

Вообще, проблемы с cURL на PHP были, кажется, если не всегда, то очень часто. В процессе гугления своей проблемы, я натыкался на темы, некоторым из которых было больше чем дюжина лет.

Кроме этого, гугление дало ещё несколько выводов:

В Интернете достаточно «инструкций для дибилов», в которых подробно, с картинками, рассказывают как раскомментировать строку extension=php_curl.dll в файле php.ini.

На официальном сайте PHP, в разделе по установке cURL, есть всего два предложения относительно системы Windows:

Для работы с этим модулем в Windows файлы libeay32.dll и ssleay32.dll должны существовать в системной переменной окружения PATH. Вам не требуется файл libcurl.dll с сайта cURL.

Я прочитал их десяток раз. Переключился на английский язык и прочитал ещё несколько раз на английском. С каждым разом всё больше убеждаясь, что эти два предложения написали животные, или кто-то просто попрыгал попой на клавиатуре — я не понимаю их смысла.

Ещё есть несколько каких-то сумасшедших советов и инструкций (некоторые я успел даже опробовать).

На сайте баг репортов ПХП я уже вплотную подобрался к разгадке, что нужно в системную переменную PATH включить каталог с PHP.

Читайте также:  Install downloaded python package

В общем, для тех, у кого проблема с cURL и кому нужно «в системную переменную PATH включить каталог с PHP», перейдите к уже названной выше инструкции http://php.net/manual/ru/faq.installation.php#faq.installation.addtopath. Там всё просто, а, главное, человеческим языком написано, что нужно сделать.

3 комментария

Спасибо помогло Способ второй (очень быстрый, но тоже не кошерный). Из каталога PHP скопировать файл libssh2.dll в каталог Apache24bin и перезапустить Apache.

Из каталога PHP скопировать файл libssh2.dll в каталог Apache24bin и перезапустить Apache. — спасибо, друже, помогло.

Оставьте ответ Отменить ответ

📅 С 20 по 22 апреля пройдут незабываемые битвы среди кибер-гладиаторов в мире информационной безопасности!

Открыта регистрация команд по ссылке .

Источник

cURL не работает

Гуглил, но решения не удалось найти. Что за метод защиты стоит, что запрещает парсить данные с данного сайта ?

$url = 'http://elibrary.ru/titles.asp'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6'); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_REFERER, $url); $content = curl_exec($ch); curl_close($ch); echo $content; 

2 ответа 2

Суть проблемы в следующем: целевой сайт выставляет cookie для идентификации пользователя и отдает код 302 Moved Temporarily + заголовок Location . Это что-то вроде защиты от простеньких парсеров, не способных работать с cookie.

Если говорить о вашем коде, то опция CURLOPT_FOLLOWLOCATION выставленная в false (или 0 ), запрещает переходы по ссылкам из Location . Поэтому вы видите в ответе:

Выставление CURLOPT_FOLLOWLOCATION в true (или 1 ) не помогает в вашем случае потому, что curl по умолчанию все еще не работает с cookie. А чтобы работал, достаточно указать:

curl_setopt($ch, CURLOPT_COOKIEFILE, ''); 

Пустая строка в качестве значения, указывает curl, что cookie должны быть использованы, однако без сохранения в файловую систему (см. http://php.net/manual/ru/function.curl-setopt.php).

Читайте также:  Трою viewtopic php t

Таким образом, работающий код может выглядеть так:

$url = 'http://elibrary.ru/titles.asp'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6');. curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_COOKIEFILE, ''); $content = curl_exec($ch); curl_close($ch); echo($content); 

Источник

PHP CURL вдруг не работает без причины

В настоящее время я работаю над проектом, который выполняет ajax-вызов моего API на том же сервере. Все шло хорошо до тех пор, пока несколько часов назад внезапно перестал работать cURL без всякой причины

Protocol https not supported or disabled in libcurl 

Но это не имеет никакого смысла, потому что это работало ранее, и единственное, что я изменил, было что-то на экране входа в систему (только PHP) и часовой пояс на сервере со значения по умолчанию до «Европа / Берлин» с

dpkg-reconfigure tzdata [php.ini] date.timezone = "Europe/Berlin"; 

Я уже перезапустил apache2, перезагрузил сервер, проверил файл php.ini и мой phpinfo, все без ошибок или изменений, но curl просто не будет работать. Я пытался свернуть другие хосты и localhost, но ничего не работает. Я также проверил / var / mail / root, ошибок нет.

Немного информации на мой сервер

  • Debian 8
  • Сертификат SSL от Symantec
  • полный root-доступ без каких-либо ограничений

Это код CURL, который я использую

 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $this->url); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, count($params)); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); session_write_close(); $result = curl_exec($ch); curl_close($ch); session_start(); 

Как я уже сказал, он работал нормально и без проблем дольше 1 месяца. Это самая странная вещь, которую я когда-либо видел. Я надеюсь, что кто-нибудь может мне помочь. Если нет, есть ли хорошие альтернативы скручиванию? (POST-запросы)

Источник

Оцените статью