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_content
是 false
。
谁能建议/建议可能出了什么问题?
【问题讨论】:
请咨询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_error
和curl_errno
之后调用curl_close
,否则你也会在这里得到false
。发生在我身上。真实的故事。【参考方案2】:
就我而言,我需要将VERIFYHOST
和VERIFYPEER
设置为false
,如下所示:
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
在致电curl_exec($ch)
之前。
因为我在两个具有自分配证书的开发环境之间工作。
如果证书有效,则无需将VERIFYHOST
和VERIFYPEER
设置为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的主要内容,如果未能解决你的问题,请参考以下文章