什么是重复的卷曲选项,为什么它们的常量名称不同?

时间:2015-04-12 12:50:14

标签: php curl

在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中所示)。

这导致了一个问题:为什么相同选项存在重复的常量名称,这意味着什么?

1 个答案:

答案 0 :(得分:1)

不同的命名选项常量表示相同的设置或选项。这是由于底层卷曲库随时间的变化。您不仅可以在PHP中交替使用它们,还可以在curl库中使用它们,因为PHP会从libcurl c库中导入这些常量。

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

  1. CURLOPT_READDATA未记录的常量
  2. CURLOPT_INFILE :上传时应从中读取传输文件的流资源。
  3. 第一个没有在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密钥所需的密码密码字符串。
    4. 首先再进行版本检查:

       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卷曲扩展和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以来已弃用)