尝试访问本地文件时,啥会导致 curl 返回 false?

Posted

技术标签:

【中文标题】尝试访问本地文件时,啥会导致 curl 返回 false?【英文标题】:what would cause curl to return false when trying to access a local file?尝试访问本地文件时,什么会导致 curl 返回 false? 【发布时间】:2012-09-03 18:10:18 【问题描述】:

这个网站已经运行了几个月,并且运行良好。我有一个 php 页面,它根据 url 中的数据创建发票(例如 viewinvoice.php?id=250 根据记录 250 构建发票)。此页面可通过网络浏览器访问,并且运行良好。

在一个完全不同的页面(即 test.php)上,我试图通过 cURL 访问该文件。但是,当我拨打电话并 var_dump 结果时,我得到 bool(false)。

这是进行 cURL 调用的函数:

function file_get_contents_curl($url) 
$ch = curl_init();

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);

$data = curl_exec($ch);
curl_close($ch);

return $data;

HOME 是一个常量,表示完整的 url(例如http://www.example.com/)。

$invoice_contents = file_get_contents_curl(HOME.'viewinvoice.php?id=242');
echo $invoice_contents;
var_dump( $invoice_contents );

我尝试将网址更改为外部网址(即http://www.google.com/)并且页面加载正常。我得到谷歌的主页。但是不会加载同一域中的任何页面。发生这种情况有什么原因吗?

我不是服务器管理员,但我拥有服务器的 root 访问权限。我最近没有更改任何设置,但是服务器管理员可能升级了apache或php的版本?

无论如何,我可以修改一个设置以使其再次工作吗?

附:我刚刚尝试从外部服务器(不同的域)进行这个确切的调用,它工作得很好。

【问题讨论】:

【参考方案1】:

在你的 curl 执行之后,输入如下内容:

echo curl_getinfo($ch) . '<br/>';
echo curl_errno($ch) . '<br/>';
echo curl_error($ch) . '<br/>';

您会看到在 curl 执行期间失败的原因。

更多信息:curl_getinfocurl_errnocurl_error

【讨论】:

我在 curl_close($ch) 之前添加了这些行,并且能够看到有关请求的更多信息。我将来肯定会使用这种方法。不幸的是,在我开始尝试之前,问题就自行解决了,所以没有出现错误。该网站恢复了以前的工作状态。我从没想过我会说我希望它仍然坏掉,但因为我不知道出了什么问题......我希望它是。如果再次发生这种情况,我一定会使用此信息。【参考方案2】:

执行后放这个变量来测试你的错误

echo "<pre>";
var_dump( curl_getinfo($ch) ) . '<br/>';
echo curl_errno($ch) . '<br/>';
echo curl_error($ch) . '<br/>';

【讨论】:

【参考方案3】:

我遇到了类似的问题,PHP curl 返回错误。接受的答案并不能解决问题。

我的案例:我有一个网站,它通过 PHP curl 调用我的私人服务器以获取数据。它工作了 2 年,但突然 curl 开始返回 false。

    我尝试在浏览器中打开我的私人服务器页面,它正在工作 很好。

    我尝试了 PHP file_get_contents("http://my.server/page.php"); 并且工作正常。

但是 curl 仍然返回 false。


为了调试 PHP curl,我在这里找到了一个更好的解决方案: Php - Debugging Curl

问题:我的 ISP 出现了网络问题,当时我的互联网连接速度从 100Mbps 下降到 1.5Mbps - PHP curl 没有花费足够的时间来等待响应。


解决方案:我在 curl 调用中添加了这 2 行代码:

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 300); //timeout in seconds

我在这里找到的:Setting Curl's Timeout in PHP

【讨论】:

以上是关于尝试访问本地文件时,啥会导致 curl 返回 false?的主要内容,如果未能解决你的问题,请参考以下文章

在 pypi.python.org 上,啥会导致显式搜索返回隐藏的旧版本

如果任一参数为 NaN,啥会导致 C/C++ <、<= 和 == 运算符返回 true?

MSMQ:从队列接收时,啥会导致“资源不足以执行操作”错误?

来自本地 PHP 的 Axios GET 只是返回代码而不是执行

Php Curl 在本地机器上返回数据,但在服务器上返回 bool false

virtualenvwrapper 安装失败 - “啥会导致 ImportError:没有名为核心的模块”等?