Я использую PHP Wampserver 3.2.6 под Windows 11 с бесплатной версией Avast Antirus.
И версия PHP 8.1.0.
Теперь я настроил простой скрипт curl для получения данных с удаленного хоста. Но это ничего не возвращает. Когда я размещаю все это онлайн на сервере, все работает отлично. Но с локальной машины не работает.
Я попытался запустить все это под почтальоном. А там нормально работает.
private function __curl($url, $decode = true){
// * create curl resource
$ch = curl_init();
// * set url
curl_setopt($ch, CURLOPT_URL, $this->api_url.$url);
// * return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// * set headers
$headers = array('X-IM-API-KEY: '.$this->api_key);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, true);
// * if any postdata set
if (!empty($this->postdata)){
// * initialize post
$this->__post();
// * set postdata
curl_setopt($ch, CURLOPT_POST, count($this->postdata));
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->postfieldstr);
}
// $output contains the output string
$output = curl_exec($ch);
// close curl resource to free up system resources
curl_close($ch);
// * if no decode
if (!$decode) return $output;
// * return result
return json_decode($output, true);
}
Когда я просто использую file_get_contents, он отлично работает.
file_get_contents($this->api_url.$url);
Результат :
{"успех":ложь,"ошибка":истина,"сообщение":"поля отсутствует","данные":{"электронная почта":"не задана","пароль":"не установить","версия_приложения":"1.1"}}
Конечно, он выдаст ошибку, потому что ожидает POST-параметров с именем пользователя и паролем.
У меня есть следующая конфигурация, видимая в PHPinfo :
Я надеюсь, что кто-то может сказать мне, в чем была бы моя ошибка.
РЕДАКТИРОВАТЬ
Когда я добавляю:
curl_error($ch);
Я получаю следующую ошибку:
Проблема с сертификатом SSL: невозможно получить сертификат локального эмитента
Но при просмотре адреса в FireFox я вообще не получаю никакой ошибки. (летскрипт)
Обновлено: Ответ добавлен: @codenathan
Добавление следующего кода для отключения проверки хоста и узла на самом деле помогает.
Я думаю, что в сочетании с локальным брандмауэром сертификат letscrypt просто не прошел так, как должен был.
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Поскольку мне это нужно для целей разработки, это действительно помогает мне.
Попробуйте добавить: curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);
Хотя мой ответ выше будет работать, отключать его не идеально: saotn.org/…
@codenathan На самом деле это действительно работает! Спасибо! Я думаю, что в сочетании со средой Windows + брандмауэром сертификат letscrypt не проходит.
Звучит как проблема CURLOPT_CAPATH/openssl.cafile/curl.se/docs/caextract.html
@codenathan, вы можете добавить свой комментарий в качестве поста? Чтобы я мог пометить это как ответ?
curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);
Однако не рекомендуется отключать это: https://www.saotn.org/dont-turn-off-curlopt_ssl_verifypeer-fix-php-configuration/
Пробегите var_dump(curl_getinfo($ch)); между исполнением и закрытием.