PHP通过代理进行卷曲

PHP通过代理进行卷曲,php,curl,proxy,http-headers,http-status-codes,Php,Curl,Proxy,Http Headers,Http Status Codes,我试图通过PHP中的代理发送一个cURL请求 $c = curl_init(); curl_setopt($c, CURLOPT_URL, $this->url); curl_setopt($c, CURLOPT_PROXY, $this->proxy); curl_setopt($c, CURLOPT_POST, true); curl_setopt($c, CURLOPT_USERAGENT, $this->browser); curl_setopt($c, CURLOPT

我试图通过PHP中的代理发送一个cURL请求

$c = curl_init();
curl_setopt($c, CURLOPT_URL, $this->url);
curl_setopt($c, CURLOPT_PROXY, $this->proxy);
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_USERAGENT, $this->browser);
curl_setopt($c, CURLOPT_POSTFIELDS, $requestData);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_HEADER, 1);
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($c);
以下是我得到的错误:

HTTP_代码:201(ID:511a59debf97b)
HTTP_代码:201(ID:511a59e25bc89)
HTTP_代码:201(ID:511a59e47797c)
HTTP_代码:201(ID:511a59e641246)
HTTP_代码:400(ID:511a59e9850dc)
HTTP_代码:400(ID:511a59ea59bda)
HTTP_代码:400(ID:511a59eb90572)
HTTP_代码:201(ID:511a59ec647ad)
HTTP_代码:411(ID:511a59efda30a)
HTTP_代码:201(ID:511a59f0c6c70)

正如你所看到的,它们都是2xx和4xx,我不知道为什么会这样。我可能还应该提到,有时(大约所有请求的1/8)请求“工作”,因此它满足了此脚本的目的,但它仍然记录此类错误

这是错误日志代码

#check for errors
$errorsFile = $this->folders["root"].$this->folders["db"].$this->files["errors"];
if(curl_errno($c)) file_put_contents($errorsFile, "CURL_ERRNO: ".curl_errno($c)." (ID: ".$this->requestID.")\n", FILE_APPEND);
else {
    $httpCode = curl_getinfo($c, CURLINFO_HTTP_CODE); #checks http status
    if($httpCode != 200) file_put_contents($errorsFile, "HTTP_CODE: ".$httpCode." (ID: ".$this->requestID.")\n", FILE_APPEND);
}
curl_close($c);
#log
$log = str_replace("\n", "", date("d.m.Y - H:i", time()) . " " . $this->proxy . " [" . $this->browser . "] (ID: ".$this->requestID.")")."\n" ;
file_put_contents($this->folders["root"].$this->folders["db"].$this->files["logs"], $log, FILE_APPEND);
如您所见,我也记录了旋度错误(如果发生),但很少发生

然而,我不确定这些错误是从哪里来的,也不知道为什么它有时有效,有时无效。如果代理有问题,我应该得到一个cURL错误而不是HTTP错误,对吗?那怎么了

更新 感谢@Dharmavir


代理似乎是一个问题。您可以在cURL请求中添加一个标题吗 “内容长度:”。我在这方面有经验 有时,代理或防火墙(在我的例子中是ipcop)被阻止 请求不包含内容长度标头,并被视为病毒或错误 请求


我没有提到,
$proxy
是随机选择的,因此总是不同的。我手动测试了一个有效的代理,它成功地处理了10个请求中的10个

您应该记录请求数据/url。尤其是400/411。400=请求错误,411=所需长度。代理似乎是一个问题。您可以在cURL请求中添加一个标题“Content Length:”。我过去的经验是,有时代理或防火墙(在我的例子中是ipcop)会阻止没有内容长度头的请求,并将其视为病毒或错误请求。它是什么代理?你能配置代理吗?或者它是你的“黑匣子”@hek2mgl-nope,不能配置任何东西。它从proxylist网站随机获取代理。但是你上面发布的结果都来自一个代理?还是不同的代理?