PHP cURL通过代理

时间:2013-02-12 15:19:36

标签: 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_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_CODE:201(ID:511a59debf97b)
  HTTP_CODE:201(ID:511a59e25bc89)
  HTTP_CODE:201(ID:511a59e47797c)
  HTTP_CODE:201(ID:511a59e641246)
  HTTP_CODE:400(ID:511a59e9850dc)
  HTTP_CODE:400(ID:511a59ea59bda)
  HTTP_CODE:400(ID:511a59eb90572)
  HTTP_CODE:201(ID:511a59ec647ad)
  HTTP_CODE:411(ID:511a59efda30a)
  HTTP_CODE: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错误(如果它们发生)但很少发生。

但是,我不确定这些错误来自哪里以及为什么它有时会起作用,有时则不然。如果代理有问题,我应该得到一个cURL错误而不是HTTP错误,对吧?那有什么不对?

更新 感谢@Dharmavir

  

代理似乎是一个问题。可以在cURL请求中添加标头吗?    “Content-Length:”。我有经验    过去,有时代理或防火墙(在我的情况下ipcop)被阻止    请求没有内容长度标头并被视为病毒或坏    请求。

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

0 个答案:

没有答案