首页 > 解决方案 > 使用 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";

标签: phpcurl

解决方案


回答我自己的问题。

安装 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);.

卷曲常数数值


推荐阅读