PHP;通过浏览器与CLI访问时,cURL的行为不同

PHP;通过浏览器与CLI访问时,cURL的行为不同,php,curl,cloudflare,Php,Curl,Cloudflare,我有一个服务器应用程序,它将通过CLI在后台运行一些长期运行的PHP脚本。其中之一是一个简单的爬行器,它将浏览一系列网站,并使用cURL获取它们的内容 当执行该工作的函数是浏览器访问的页面的一部分时,它工作正常。当我将这项工作放到运行在CLI中的PHP脚本中时,cloudflare后面的站点无法声明“请启用Cookie”,然后详细说明我被阻止了 这是PHP函数: static function getPage($url, $timeout = 5) { $agent= 'Mozilla/

我有一个服务器应用程序,它将通过CLI在后台运行一些长期运行的PHP脚本。其中之一是一个简单的爬行器,它将浏览一系列网站,并使用cURL获取它们的内容

当执行该工作的函数是浏览器访问的页面的一部分时,它工作正常。当我将这项工作放到运行在CLI中的PHP脚本中时,cloudflare后面的站点无法声明“请启用Cookie”,然后详细说明我被阻止了

这是PHP函数:

static function getPage($url, $timeout = 5)
{
    $agent= 'Mozilla/5.0 (compatible; SimpleSpiderBot/0.1; +'.url('/').')';
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

    $html = @curl_exec($ch);
    curl_close($ch);
    return $html;
}
让我困惑的是,做这项工作的PHP都是一样的,只是PHP环境(CLI与Apache请求)不同。我尝试将PHPCLI命令设置为使用与页面相同的PHP.ini文件,但没有成功


编辑:添加了Cookie处理代码,但当无法解决问题时,为了清晰起见,我删除了多余的代码。

我想不出为什么web服务器会成功,但涉及Cookie时CLI会失败。根据haxx.se,我相信它是curl的官方网站。我相信你上面的脚本在默认情况下根本不会处理cookie。如果网站需要cookies,你会得到任何正确的行为,这表明你忽略了什么,或者你的问题出在其他地方


请注意,您可以设置curl请求以接受cookies。

问题在于CloudFlare将尝试验证请求的几个方面,但它不一定说明什么是“格式错误”。在本例中,我编写的url()函数在后台运行时返回“/”,而不是像在浏览器中那样返回完整的url,如“example.com/”。这意味着用户代理将读取“Mozilla/5.0(兼容;SimpleSpiderBot/0.1;/)”,这显然是Cloudflare不喜欢的


我对陷入这个问题的开发人员的建议是彻底检查每个标题和选项,看看Cloudflare是否会对内容“挑剔”,因为即使是轻微的“畸形”也会阻止请求。

尝试在服务器和故障站点之间捕获数据包,并比较这两种情况下的HTTP头?还有apache有什么IP,cli有什么IP?相同的ip?@Barmar Wireshark的数据让我感到非常困扰,你会推荐一款不错的Linux新手包嗅探器应用吗?我通常不在数据包级别上工作。@hansenrik应该是同一个IP,我会详细描述它,看看它说什么。有更新吗?谁是白痴,你还是Cloudflare的人?我曾经这样做过;它没有效果,所以我在发布之前再次删除了多余的代码。如果友好的落选选民解释落选的原因,我会很高兴地修改或删除我的答案。如果你想确保你的curl脚本处理cookies,这个问题以前已经被问过了。@Kver我已经编辑了我的回答以提供更多的细节。我不是否决它的人,我没有投票的唯一原因是当它告诉我cookies是问题时,我先尝试了cookies;我应该在OP中提到这一点。正如我在上面的评论中提到的,单斜杠不是有效的url。这与cloudflare无关。他在哪里说
$url
是一个斜杠?他说的是设置
$agent
时使用的
url('/')