PHP cURL -random -不工作,错误调试没有提供任何东西


PHP cURL -randomly- not working, error debugging provides nothing

基本上,我有一个简单的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错误。

最奇怪的是,对于网站的其他用户,这个功能工作得很好,不会给他们错误-即使试图访问相同的url。我这辈子都弄不明白,为什么这种选择性的方法对我不起作用,对我一个人不起作用。

编辑:

我应该提到,curl_getinfo()似乎为我工作,即使curl_exec()不工作。例如,我可以完全正确地获取标题信息,但是curl_exec()仍然会失败。这让我很困扰,因为这似乎与我在网站上的用户帐户直接相关-我为自己获取cookie信息的方式是否与此错误有关?我无法想象这是怎么回事,但这确实是我如何处理我个人使用函数的方式与网站上的其他用户之间的唯一区别(就PHP解释器而言)。

此外,当通过SSH连接时,我可以成功地从我的专用机器上ping我试图访问的网站。

我解决了我的问题-虽然我仍然不知道原来的问题是什么。我转而使用get_headers()与stream_context_set_default()和fopen()与stream_context_create()。

不幸的是(对我来说),fopen()尊重HTTP响应代码,所以它不会像自定义404错误页面或503页面那样获取页面数据。我的解决方法是在我尝试打开之前检查标题,并将文件内容输出为"404 -未找到页面"等。

这实际上不是解决我原来的问题,但它解决了这个问题。我仍然感到困惑,为什么cURL突然停止工作。虽然,我过去遇到过cURL选择性地决定"不工作"的问题,甚至在我自己的机器上也是如此。我的网站的用户也报告了(虽然不经常)相同类型的错误。

现在一切都很顺利,所以问题似乎已经解决了。