尝试访问本地文件时,啥会导致 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 只是返回代码而不是执行