curl_exec() 总是返回 false

Posted

技术标签:

【中文标题】curl_exec() 总是返回 false【英文标题】:curl_exec() always returns false 【发布时间】:2012-01-03 21:39:04 【问题描述】:

我写了这段简单的代码:

$ch = curl_init();

//Set options
curl_setopt($ch, CURLOPT_URL, "http://www.php.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$website_content = curl_exec ($ch);

在我的例子中,$website_contentfalse。 谁能建议/建议可能出了什么问题?

【问题讨论】:

请咨询curl_error()了解错误详情并在此处发布。 @LinusKleen 如果您发布 curl_error() 作为答案,我会支持它,因为它让我可以看到我的问题是什么。 到底是什么问题? curl_error() 揭示了什么错误? 【参考方案1】:

错误检查和处理是程序员的朋友。检查初始化和执行 cURL 函数的返回值。 curl_error()curl_errno() 将包含更多信息以防失败:

try 
    $ch = curl_init();

    // Check if initialization had gone wrong*    
    if ($ch === false) 
        throw new Exception('failed to initialize');
    

    // Better to explicitly set URL
    curl_setopt($ch, CURLOPT_URL, 'http://example.com/');
    // That needs to be set; content will spill to STDOUT otherwise
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // Set more options
    curl_setopt(/* ... */);
    
    $content = curl_exec($ch);

    // Check the return value of curl_exec(), too
    if ($content === false) 
        throw new Exception(curl_error($ch), curl_errno($ch));
    

    // Check HTTP return code, too; might be something else than 200
    $httpReturnCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    /* Process $content here */

 catch(Exception $e) 

    trigger_error(sprintf(
        'Curl failed with error #%d: %s',
        $e->getCode(), $e->getMessage()),
        E_USER_ERROR);

 finally 
    // Close curl handle unless it failed to initialize
    if (is_resource($ch)) 
        curl_close($ch);
    


*curl_init() manual 声明:

成功时返回 cURL 句柄,错误时返回 FALSE

当您使用其$url 参数并且无法解析域时,我观察到该函数返回FALSE。如果参数未使用,函数可能永远不会返回FALSE。不过,请务必检查它,因为手册没有明确说明实际的“错误”是什么。

【讨论】:

+1:在curl_exec FALSE 返回时对 PHP 中的 curl 进行简单而直接的故障排除。 - Curl Verbose Mode in PHP example 没问题。获得了复兴徽章 :-) 感谢您的接受。 别忘了 curl_close($ch); 当变量超出范围时它会隐式关闭,但可以肯定。我做了一个完整的例子。谢谢,@RafikBari。 并确保在curl_errorcurl_errno 之后调用curl_close,否则你也会在这里得到false。发生在我身上。真实的故事。【参考方案2】:

就我而言,我需要将VERIFYHOSTVERIFYPEER 设置为false,如下所示:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

在致电curl_exec($ch)之前。

因为我在两个具有自分配证书的开发环境之间工作。 如果证书有效,则无需将VERIFYHOSTVERIFYPEER 设置为false,因为curl_exec($ch) 方法将起作用并返回您期望的响应。

【讨论】:

【参考方案3】:

这件事昨天发生在我身上,就我而言,是因为我正在按照 PDF 手册开发一些模块来与 API 进行通信,并在直接从手册中复制链接时,出于某种奇怪的原因,hyphen 来自复制的链接采用不同的编码,因此curl_exec() 总是返回false,因为它无法与服务器通信。

我花了几个小时终于明白了下面字符的区别:

https://www.e‐example.com/api
https://www.e-example.com/api

每次我尝试直接从浏览器访问链接时,它都会转换为https://www.xn--eexample-0m3d.com/api

在您看来它们是相等的,但是如果您检查hyphens here 的编码,您会发现第一个hyphen 是一个unicode 字符U+2010,另一个是@987654323 @。

希望这对某人有所帮助。

【讨论】:

以上是关于curl_exec() 总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章

curl请求curl_exec返回false,curl_error返回空

php 中 怎么让curl_exec 以数组形式返回

php 中 怎么让curl_exec 以数组形式返回

PHP - curl_exec 需要 100 毫秒

为啥 curl_exec($url) 返回空字符串

curl_exec 使用谷歌云消息返回 null