0

我正在尝试通过 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 个。

4

0 回答 0