Curl_exec()始终返回 false

我写了这段简单的代码:

$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。 有没有人能提出一些可能出错的建议?

154834 次浏览

错误检查和处理是程序员的朋友。检查初始化和执行 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() 手动操作指出:

返回成功时的 cURL 句柄,错误时返回 假的

我观察到,当您使用它的 $url参数并且无法解析域时,函数返回 FALSE。如果参数未使用,函数 也许吧将永远不返回 FALSE。尽管如此,还是要经常检查它,因为手册没有明确说明“错误”到底是什么。

这种情况昨天发生在我身上,在我的情况下,是因为我遵循一个 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

希望这对谁有帮助。

在我的例子中,我需要将 VERIFYHOSTVERIFYPEER设置为 false,像这样:

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

在打电话给 curl_exec($ch)之前。

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