curl_exec()总是返回false


113

我已经写了这段简单的代码:

$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_content当属false。谁能建议/建议出什么问题了?


8
请咨询curl_error()错误详细信息,并将其发布在这里。
Linus Kleen

@LinusKleen如果您将curl_error()作为答案发布,我会对其进行投票,因为它可以使我看到问题所在。
吉尔斯·罗伯茨

到底是什么问题?发现了什么错误curl_error()
showdev 2014年

Answers:


241

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

try {
    $ch = curl_init();

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

    curl_setopt($ch, CURLOPT_URL, 'http://example.com/');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    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));
    }

    /* Process $content here */

    // Close curl handle
    curl_close($ch);
} catch(Exception $e) {

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

}

*curl_init() 手动状态:

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

我观察到该函数FALSE在您使用其$url参数且无法解析域时会返回。如果未使用该参数,则该函数可能永远不会返回FALSE。但是,请务必进行检查,因为该手册并未明确说明“错误”的实质。


9
+1:在curl_execFALSE返回时对PHP中的curl进行简单而直接的故障排除。- 卷曲详细模式在PHP示例
hakre

是的 实际上早就想通了。尽管感谢您的回答:)
Adithya

7
没问题。为此获得了复兴徽章:-)感谢您的接受。
莱纳斯·克莱恩

@marverix好吧,他的名字叫Linus:P
NinoŠkopac15年

并且不要忘记curl_close($ ch);
拉菲克·巴里

10

就我而言,我需要将VERIFYHOST和设置VERIFYPEERfalse,如下所示:

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

在致电之前curl_exec($ch)

因为我正在使用自定义证书的两个开发环境之间工作。有了有效的证书,就不需要设置VERIFYHOST和设置证书VERIFYPEERfalse因为该curl_exec($ch)方法将起作用并返回您期望的响应。


这实际上对我有用。谢谢你的提示!
n8jadams '19

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 此处的编码,您会发现第一个hyphen是unicode字符U + 2010,另一个是U + 002D

希望这对某人有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.