Как проверить, поддерживает ли curl ssl?

#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';
}