【问题标题】:What are duplicate Curl Options and why do their constant names differ?什么是重复卷曲选项,为什么它们的常量名称不同?
【发布时间】:2015-04-12 12:50:14
【问题描述】:

在 PHP curl 库中,可以使用 curl_setopt() 函数设置请求的选项,例如

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);

允许 curl 跟踪对给定“Location: ...”标头的重定向响应。常量CURLOPT_FOLLOWLOCATION 表示一个整数,表示curl 库中的选项,这里的示例整数值为int(52) 代表CURLOPT_FOLLOWLOCATION

通过选项整数值获取常量名称时,无法准确找出使用了哪个选项常量,因为某些常量具有相同的值(例如Get a constant name as a string 中所示)。

这就引出了一个问题:为什么相同的选项会有重复的常量名,这是什么意思?

【问题讨论】:

    标签: php curl


    【解决方案1】:

    不同的命名选项常量代表相同的设置或选项。这是由于底层 curl 库随着时间的推移而发生的变化。您不仅可以在 PHP 中互换使用它们,还可以在 curl 库中使用它们,因为 PHP 从 libcurl c 库中导入这些常量。

    这也是我一开始可以想象的,其中一些选项只是一个别名。以 curl 选项int(10009) 为例,它分配了两个不同的命名常量:

    1. CURLOPT_READDATA: 未记录的常量
    2. CURLOPT_INFILE:上传时要读取的文件的流资源。

    第一个在 PHP 手册中没有记录。 curl 库在此处记录了它:http://curl.haxx.se/libcurl/c/CURLOPT_READDATA.html - 它实际上与 PHP 中的 CURLOPT_INFILE 具有相同的含义。这可以在curl list of options and when introduced 作为其来源的一部分轻松跟踪:

     Name                           Introduced  Deprecated  Removed
    
    CURLOPT_READDATA                7.9.7
    CURLOPT_INFILE                  7.1           7.9.7
    

    也可以在来源 (ref) 中检查别名的状态:

    #define CURLOPT_INFILE CURLOPT_READDATA /* name changed in 7.9.7 */
    

    CURLOPT_INFILE 显然是CURLOPT_READDATA 的别名,因为它已被弃用。 PHP 手册尚未反映这一点。

    还有一组不同的命名选项常量代表同一个选项:

    1. CURLOPT_KEYPASSWD: 使用CURLOPT_SSLKEYCURLOPT_SSH_PRIVATE_KEYFILE 私钥所需的密码字符串。在 cURL 7.16.1 中添加。
    2. CURLOPT_SSLCERTPASSWD: 使用CURLOPT_SSLCERT 证书所需的密码字符串。
    3. CURLOPT_SSLKEYPASSWD: 使用CURLOPT_SSLKEY 中指定的私有 SSL 密钥所需的秘密密码字符串。

    首先再次进行版本检查:

     Name                           Introduced  Deprecated  Removed
    
    CURLOPT_KEYPASSWD               7.17.0
    CURLOPT_SSLCERTPASSWD           7.1.1         7.17.0
    CURLOPT_SSLKEYPASSWD            7.9.3         7.17.0
    

    这已经表明后两个已被弃用。让我们看看常量定义(ref & ref):

    ...
    /* These are scheduled to disappear by 2009 */
    
    /* The following were added in 7.17.0 */
    #define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD
    ...
    #define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD
    ...
    

    所以可以明确的说CURLOPT_SSLKEYPASSWDCURLOPT_SSLCERTPASSWD都是CURLOPT_KEYPASSWD的别名。

    由于本文回顾了我所知道的关于 PHP curl 扩展和 the PHP extension imports the constants from the libcurl C library 的常量名称中的所有冲突,因此您可以放心,这些都是别名。

    为了将来的兼容性,在代码中使用非弃用常量可能是最安全的:

    • CURLOPT_READDATA(自 7.9.7 起)
    • CURLOPT_KEYPASSWD(自 7.17.0 起)

    这将与以下相反:

    • CURLOPT_INFILE(自 7.1 起,自 7.9.7 起现已弃用)
    • CURLOPT_SSLCERTPASSWD(自 7.1.1 起,自 7.17.0 起现已弃用)

    【讨论】:

      猜你喜欢
      • 2010-12-13
      • 2010-11-25
      • 1970-01-01
      • 2011-09-22
      • 2012-04-02
      • 2015-08-27
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      相关资源
      最近更新 更多