基本上,我有一个简单的cURL获取网页功能,其中包括以下内容;
function FETCH_WEBPAGE($url) {
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $url);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30');
$file = curl_exec($curl_handle);
if($file===false) {
DEBUG_TXT('Error reading '.$url.chr(10).curl_error($curl_handle));
} else {
DEBUG_TXT('Fetching: '.$url.' - Got: '.$response['url'].chr(10).$file);
}
$response = curl_getinfo($curl_handle);
curl_close($curl_handle);
if(trim($response['url'])=='') {
$response['url'] = $url;
}
return array('file'=>$file,'url'=>$response['url']);
}
现在,我正在运行自己的Apache服务器,并且还有一个运行Apache的专用服务器。当我从自己的机器运行此代码时,一切运行顺利。只要我请求的服务器可用,我的DEBUG_TXT就会返回“获取/获取”(带内容)响应。 (它创建一个DEBUG文本文件。)
然而,当我从我的专用服务器运行它时,我无法让它工作。我总是得到错误“找不到主机”或“名字查找超时”作为我的cURL错误。
最棒的是,对于网站的其他用户来说,即使尝试访问相同的网址,此功能也能完美地运行并且不会出现错误。对于我的生活,我不能理解为什么这个选择性对我和我一个人都不起作用。
编辑:
我应该提一下curl_getinfo()似乎对我有用,即使curl_exec()没有。我可以获取标题信息,例如,完全没问题,但curl_exec()仍然会失败。这让我很烦心,因为这似乎与我在网站上的用户帐户直接相关 - 我为自己获取cookie信息的方式可能与此错误有关吗?我无法想象它是怎么回事,但就我在处理个人使用该功能的方式与网站上的其他用户之间的处理方式而言,它实际上是唯一的区别(就PHP解释器而言)。 / p>
此外,当我通过SSH连接时,我可以成功ping我正在尝试从我的专用计算机访问的网站。
答案 0 :(得分:1)
我解决了我的问题 - 虽然我仍然不知道最初的问题是什么。我转而使用带有stream_context_set_default()的get_headers()和带有stream_context_create()的fopen()。
不幸的是(对我而言),fopen()尊重HTTP响应代码,因此它不会获取页面数据,如自定义404错误页面或503页面。我的解决方法是在尝试fopen之前检查标题,然后将文件内容输出为“404 - 找不到页面”等。
这实际上并不是我原来问题的解决方案,但它解决了这个问题。我仍然感到困惑,为什么cURL无处不在。虽然,过去我遇到过问题,cURL有选择地决定即使在我自己的机器上“不工作”。我网站的用户报告了(虽然不经常)相同类型的错误。
现在一切都在顺利进行,所以似乎问题已经解决了。