завивать это библиотека, которая позволяет вам делать HTTP-запросы в PHP. Команда curl_exec в PHP — это мост для использования curl из консоли. curl_exec позволяет легко и быстро выполнять запросы GET / POST, получать ответы от других серверов, таких как JSON, и загружать файлы.
В некоторых средах разработки выполнение следующего кода приведет к отказу из-за использования CURLOPT_FOLLOWLOCATION
:
В этой статье вы узнаете, почему это происходит и как это решить.
Почему это происходит
Эта ошибка происходит, когда ваша конфигурация PHP запретить вам следить за местоположением.
Возможные решения
Как и в любой среде и случаях, не все перечисленные варианты будут работать для вас:
1. Установите для CURLOPT_FOLLOWLOCATION значение false
CURLOPT_FOLLOWLOCATION
опция указывает, должен ли cURL следовать за HTTP 3xx
перенаправляет или нет. Когда вы запрашиваете URL, иногда вы можете быть перенаправлены на другой URL, например, в PHP вы можете перенаправить, используя:
header('Location: http://example.com/');
По умолчанию этот параметр отключен, и обычно нет веских причин для его отключения, однако, если вы знаете, что делаете, и уверены, что ваш запрос никогда не будет перенаправлен, то вы можете просто отключить этот параметр:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
2. Отключить безопасный режим PHP
Безопасный режим - это попытка решить некоторые проблемы, возникающие при работе веб-сервера с поддержкой PHP в среде общего хостинга. Однако дополнительные проверки безопасности, налагаемые безопасным режимом, выполняются на уровне PHP, поскольку базовой архитектуры безопасности веб-сервера и операционной системы обычно недостаточно для наложения необходимых ограничений безопасности для многопользовательской среды, в которой многие пользователи могут быть в состоянии загрузить и выполнить код PHP.
Включение безопасного режима накладывает несколько ограничений на сценарии PHP, эти ограничения в основном касаются доступа к файлам, доступа к переменным среды и управления выполнением внешних процессов. Эти ограничения влияют на cURL, когда включены опции FOLLOWLOCATION, поэтому, если вы не можете отключить эту опцию в cURL, для того, чтобы ваш скрипт работал, вам нужно отключить безопасный режим, изменив свой php.ini
файл.
Используйте любой код или текстовый редактор и редактируйте свой php.ini
файл и поиск safe_mode
вариант и установить Off
как значение, как это, вероятно, уже с On
,
Перезапустите apache и попробуйте снова выполнить ваш скрипт. Или, если вы не можете изменить php.ini
файл в вашей среде, вы можете попробовать установить это свойство динамически с PHP в вашем скрипте, используя:
ini_set('safe_mode', false);
Хотя второй способ вряд ли подойдет большинству разработчиков, стоит попробовать.
3. Установите для open_basedir значение none
Функция open_basedir определяет места или пути, из которых PHP разрешен доступ к файлам, используя такие функции, как fopen()
а также gzopen()
, Если файл находится за пределами путей, определенных open_basedir
, PHP откажется его открывать. Вы не можете использовать символическую ссылку в качестве обходного пути, потому что путь, к которому разрешается символическая ссылка, подпадает под ограничения open_basedir
функция.
Чтобы отключить open_basedir
вариант, нам просто нужно прокомментировать это в файле php.ini. Откройте код или текстовый редактор и отредактируйте файл php.ini, найдите опцию open_basedir и прокомментируйте, добавив к нему префикс ;
:
; open_basedir, if set, limits all file operations to the defined directory
; and below. This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file.
; http://php.net/open-basedir
;open_basedir =
Сохраните изменения, перезапустите apache и попробуйте снова выполнить ваш скрипт.
Вы можете либо на своем сервере, если вы используете Plesk для изменения open_basedir
из графического интерфейса. Откройте plesk, перейдите к своему домену и откройте настройки PHP.
Теперь перейдите из списка, чтобы найти open_basedir
и выберите никто из списка:
Сохраните изменения и попробуйте снова выполнить ваш скрипт.
Похвальные грамоты
Если вы используете библиотеку, как Unirest и вы получите такую ошибку, вы можете попробовать первый вариант, установив для параметра CURLOPT_FOLLOWLOCATION значение false без изменения исходного кода библиотеки с помощью:
Unirest\Request::curlOpts(array(
CURLOPT_FOLLOWLOCATION => false
));
Не забудьте поделиться с сообществом, какой вариант сработал для вас, счастливого кодирования!