php - 使用 PHP 7.3.8 的未定义常量 CURLINFO_SCHEME
问题描述
我需要测试 HTTPS 是否可用于使用 PHP 的 URL,但CURLINFO_SCHEME
返回Undefined constant
错误。我正在使用最新的 PHP 版本,所以我对问题所在感到困惑。
php -V
PHP 7.3.8 (cli) (built: Jul 30 2019 09:26:16) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.8, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.8, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v2.7.2, Copyright (c) 2002-2019, by Derick Rethans
PHP 卷曲版
var_dump($version = curl_version());
array (size=14)
'version_number' => int 475137
'age' => int 4
'features' => int 4162461
'ssl_version_number' => int 0
'version' => string '7.64.1' (length=6)
'host' => string 'x86_64-redhat-linux-gnu' (length=23)
'ssl_version' => string 'NSS/3.36' (length=8)
'libz_version' => string '1.2.7' (length=5)
'protocols' =>
array (size=22)
0 => string 'dict' (length=4)
...
'ares' => string '' (length=0)
'ares_num' => int 0
'libidn' => string '' (length=0)
'iconv_ver_num' => int 0
'libssh_version' => string 'libssh2/1.8.2' (length=13)
我在 CentOS 7.6 服务器上运行。
这是产生问题的 curl 命令。
$domain = 'example.com';
$domain = rtrim(preg_replace('/^(https?:\/\/)?(www\.)?/', '', $domain), '/');
echo $domain . "\n";
$domain = "https://" . $domain;
function curl_check_ssl($domain) {
$curl = curl_init();
curl_setopt_array( $curl, array(
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
CURLOPT_HEADER => true,
CURLOPT_NOBODY => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_VERBOSE => false,
CURLOPT_CUSTOMREQUEST => 'HEAD',
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_TIMEOUT => 4,
CURLOPT_ENCODING => '',
CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
CURLOPT_URL => $domain
) );
curl_exec( $curl );
$curl_scheme = curl_getinfo($curl, CURLINFO_SCHEME);
// $curl_scheme = curl_getinfo($curl);
curl_close( $curl );
return $curl_scheme;
}
var_dump(curl_check_ssl($domain)) . "\n";
解决方案
回答我自己的问题。
安装 PHP 时,它通常会针对已安装的 Curl 版本进行编译。因为我使用 Yum 包管理器安装了 PHP,所以看起来 PHP 是针对 Yum 中包含的最新版本的 Curl 进行编译的,现在是 Curl 7.29。此版本不支持CURLINFO_SCHEME
。因此,尽管我的系统上安装了最新版本的 Curl,但通过 Yum 的 PHP 会忽略此版本。
您可以使用以下命令检查编译到扩展中的各种 PHP 常量:
$ strings /usr/lib64/php/modules/curl.so | grep CURLINFO | sort
如果结果不包含CURLINFO_SCHEME
,要让 PHP 识别这个常量,我相信唯一的方法是从源代码安装 PHP。
如果像我一样,您不想从源代码安装 PHP,那么您可以使用数值来CURLINFO_SCHEME
代替,例如1048625
.
只需将常量替换为它的数值:
$curl_scheme = curl_getinfo($curl, 1048625);
.
推荐阅读
- powershell - Powershell 新手:如何使用嵌套的 foreach 或数组(或任何其他解决方案)将 2 个或更多变量放入同一个文件中?
- r - 滚动时如何保持titlePanel(或shinyWidgets::panel)固定?
- cygwin - Windows server 2016 上的 Cygwin 安装问题 - 退出 256
- php - 填充表单字段 php wordpress
- python - Python 中的 PayPal 自适应付款转换货币请求(已弃用的 API)
- mysql - Symfony 4.3 两个实体之间的唯一实体不起作用
- regex - 为什么使用 find 时这个正则表达式在 shell 上不起作用
- reactjs - 从 React 中导入的文件调用函数时出错
- google-cloud-platform - 如何限制 G Suite 中的服务帐户访问权限?
- arrays - 获取数组中数组的名称?