PHP cURL HTTP CODEは0を返します


95

$ httpCodeをエコーするといつでも理解できません。常に0を取得します。$ html_brandを壊れたURLに変更すると、404が予期されました。私が見逃したり知らないことはありますか?ありがとう。

 //check if url exist
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $html_brand);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($httpCode == 404) {
    echo "The Web Page Cannot Be Found";
    return;
}
curl_close($ch);

回答:


95

サーバーに接続すると、サーバーから戻りコードを取得できます。それ以外の場合は失敗し、0が返されます。「www.google.com/lksdfk」に接続しようとすると、次の戻りコードが返されます。 400、直接google.comにアクセスした場合、302を取得します(次のページに転送した場合は200になります... google.com.brに転送するため、そうしますが、取得できない場合があります)。 "googlecom"に行くと0(ホストが見つかりません)を取得するので、最後の1つではコードを送り返す人がいません。

以下のコードを使用してテストされています。

<?php

$html_brand = "www.google.com";
$ch = curl_init();

$options = array(
    CURLOPT_URL            => $html_brand,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_MAXREDIRS      => 10,
);
curl_setopt_array( $ch, $options );
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ( $httpCode != 200 ){
    echo "Return code is {$httpCode} \n"
        .curl_error($ch);
} else {
    echo "<pre>".htmlspecialchars($response)."</pre>";
}

curl_close($ch);

1
また、followlocationを参照するためのthxも、301を取得することがあります。これはリダイレクトの問題です。
Ardeus 2012

$ responseにhtmlコンテンツが含まれていても奇妙ですが、$ httpcodeは常に0を返し、curl_errorはnullです。何が悪かったのでしょう。設定には、returntransfer、header(false)、followlocationのみを含めます。
Ardeus

追加するだけで、URLの前後に空白がある場合、http_code = 0がスローされます
Raja Amer Khan


80

curl_execの後にこれを試して、何が問題かを確認します。

print curl_error($ch);

「不正な形式」のように表示される場合は、URL形式を確認してください。


5
その提案をありがとう-私のお尻を保存しました:)
wbj

はい!私のお尻を保存しました。
Pimbrouwers

5

curl_getinfoの後にcurl_errorをチェックして、非表示のエラーを見つけます。

if(curl_errno($ch)){   
    echo 'Curl error: ' . curl_error($ch);
}

2

ここと下で述べように、失敗した要求(つまり、サーバーが見つからない)はfalseを返し、HTTPステータスコードは返されません

を呼び出しcurl_error()ます。


2

私は同じ問題を抱えていましたが、私の場合、php.iniでcurl_exec関数が無効になっていることが原因でした。ログを確認します。

PHP Warning:  curl_exec() has been disabled for security reasons in /var/www/***/html/test.php on line 18

解決策は、サーバー構成ファイルのphp.iniで無効になっている関数からcurl_execを削除することです。


1

$ html_brandに渡す正確なコンテンツは何ですか?

無効なURL構文がある場合、HTTPコード0を取得する可能性が非常に高くなります。


1

これを試して:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

2
承認された回答で古い質問に回答するときは、回答が対応する質問の新しい側面を指摘することが重要です。また、コードのみの回答は、一般に、それらがどのようにそしてなぜ機能するかについての説明を追加することによって改善できます。また、誰かがセキュリティを無効にすることを提案するとき、そのリスクとその理由を説明することは非常に重要です。
Jason Aller

このコードは質問に答えることがありますが、問題を解決する方法や理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
ドナルドダック

0

PHPがhttpコード0を返すもう1つの理由は、タイムアウトです。私の場合、私は次の構成を持っていました:

curl_setopt($ http、CURLOPT_TIMEOUT_MS、500);

私が指していたエンドポイントへのリクエストは常に500ミリ秒以上かかり、常にタイムアウトして常にhttpコード0を返していました。

この設定(CURLOPT_TIMEOUT_MS)を削除するか、より高い値(私の場合は5000)を設定すると、実際のhttpコードが得られます(私の場合は200)(期待どおり)。

https://www.php.net/manual/en/function.curl-setopt.phpを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.