curl_exec()始终返回false

时间:2011-11-22 13:51:05

标签: php curl

我写了这段简单的代码:

$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。 任何人都可以建议/建议可能出错的事情吗?

3 个答案:

答案 0 :(得分:203)

错误检查和处理是程序员的朋友。检查初始化和执行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() manual州:

  

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

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

答案 1 :(得分:2)

昨天发生在我身上,在我的情况下是因为我正在按照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字符{{ 3}}而另一个是U+2010

希望这有助于某人。

答案 2 :(得分:-1)

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

false

在调用curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 之前。

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