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 エラー (発生した場合) もログに記録しますが、めったに発生しません。
ただし、これらのエラーがどこから発生したのか、なぜ機能する場合と機能しない場合があるのかはわかりません。プロキシに問題がある場合は、HTTP エラーではなく cURL エラーが発生するはずですよね? では、何が問題なのですか?
更新 @Dharmavir に感謝
ここではプロキシが問題のようです。「Content-Length:」を使用して cURL リクエストにヘッダーを追加できますか。過去に、プロキシまたはファイアウォール (私の場合は ipcop) がコンテンツ長ヘッダーのない要求をブロックし、ウイルスまたは不正な要求と見なすことがあった経験があります。
$proxy
ランダムに選択されるため、常に異なるものであるとは言いませんでした。動作するプロキシを手動でテストしたところ、10 件中 10 件のリクエストすべてが正常に処理されました。