#php #ssl #curl
#php #ssl #curl
Вопрос:
Как я могу проверить, был ли php curl скомпилирован с ssl и поддерживает ли ssl? Я имею в виду, что простая проверка, чтобы увидеть, доступен ли curl, будет:
if(extension_loaded(‘curl’))
но как мне проверить, поддерживает ли curl также ssl? Мне нужна эта проверка, потому что поддержка ssl необходима для использования API на основе oauth2, и мне нужен какой-то способ быстро проверить, поддерживает ли клиентский php oauth2, прежде чем фактически использовать его (и сбой)
Комментарии:
1. Вы могли бы просто протестировать это, скажем,
https://google.com
, если curl завершается с ошибкой, вы можете перехватить ошибку и знать, что она не установлена. (понятия не имею, сработает ли это на самом деле)2. Я ищу какое-нибудь программное решение, похожее на extension_loaded() или, может быть, чтобы проверить, доступна ли какая-нибудь константа.
Ответ №1:
Смотрите http://www.php.net/manual/en/function.curl-version.php
$version = curl_version();
$ssl_supported= ($version['features'] amp; CURL_VERSION_SSL);
В $version[‘features’] у вас есть битовая маска функций. С помощью операции и между этой битовой маской и соответствующей константой вы можете проверить, включена ли выборка.
Возможные константы:
CURL_VERSION_IPV6 (целое число)
CURL_VERSION_KERBEROS4 (целое число)
CURL_VERSION_SSL (целое число)
CURL_VERSION_LIBZ (целое число)
Ответ №2:
AFAIK cURL не имеет способа проверить, включен или отключен SSL, тестирование и перехват позволят вам узнать наверняка.
Вы могли бы попробовать протестировать это, чтобы посмотреть, работает ли это. (У меня нет сервера без SSL для тестирования ..)
<?php
$v = curl_version();
print $v['ssl_version']; // I get: OpenSSL/0.9.8 - I presume you won't if it is not enabled
?>
Ответ №3:
Проверьте выходные данные stream_get_wrappers()
, есть ли https в списке, который можно использовать.
Ответ №4:
Если вы поместите этот код в файл PHP, вы сможете увидеть все подробности для PHP в браузере:
<? php
phpinfo();
?>
Ответ №5:
Я не уверен, стоит ли использовать это curl_version()['ssl_version']
, (например if (stripos(curl_version()['ssl_version'], "openssl") !== false) {
), как говорит здесь curl http://curl.haxx.se/docs/faq.html#Does_curl_work_build_with_other он может использовать другую библиотеку ssl, чем OpenSSL (которая не имеет ничего общего с этим отдельным расширением openssl, у curl есть своя собственная библиотека openssl), так что, как описано здесь http://curl.haxx.se/libcurl/c/curl_version_info.html кажется, лучше использовать проверку битовой маски CURL_VERSION_SSL, а не curl_version()['ssl_version']
. Обратите внимание, что не все эти константы, указанные на официальном веб-сайте cURL, доступны в php, а только эти четыре константы:
[CURL_VERSION_IPV6] => 1
[CURL_VERSION_KERBEROS4] => 2
[CURL_VERSION_SSL] => 4
[CURL_VERSION_LIBZ] => 8
Я протестировал это в Windows, отключив расширение «openssl» в php.ini и заметил, что curl не имеет ничего общего с этим отдельным расширением openssl, но у него есть свой собственный openssl, другими словами, отключение расширения openssl не влияет на $ v [‘ssl_version’];. Итак, если вы хотите проверить, поддерживает ли curl ssl, вам не следует полагаться на существование этого отдельного расширения openssl, и выше я объяснил, что вам не следует полагаться curl_version()['ssl_version']
ни на то, ни на другое. Единственный надежный способ — проверка битовой маски CURL_VERSION_SSL:
if (!curl_version()['features'] amp; CURL_VERSION_SSL) {
echo "SSL is not supported with this cURL installation.";
}
Ответ №6:
Если загружено расширение openssl, то cURL может его использовать.
function getScheme()
{
if (extension_loaded('openssl')) {
return 'https';
}
return 'http';
}