ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【PHP】cURL使用時にコンテンツをダウンロードせずにHTTPステータスコードのみを取得する方法

time 2017/08/04

というわけで、今回はPHPでcURLを使用した際に「HTTPステータスコードだけを取得する方法」について書いてみます。
普通にcURLを実行するとコンテンツをダウンロードするため、ファイルサイズや回線によっては遅くなってしまいます。 リンク切れ等をチェックする場合はレスポンスヘッダのみで十分なので、ちょっと無駄な感じです。

結論から言うと、「CURLOPT_NOBODYオプションをtrueで指定」することで実現できます。
ぐぐっても意外とヒットしなかったので載せておきます!

cURLのオプション

公式マニュアルにcURLで指定できるオプションの一覧があります。量が多いので大変ですが、できそうなことは把握できるかと思います。
http://php.net/manual/ja/function.curl-setopt.php

ダメだった方法

オプション一覧にCURLOPT_CONNECT_ONLYという「いかにも」なものがあるので、これでいけそうだと試行錯誤してしまいました。

function sendRequest($url) {
    $ch = curl_init($url);

    curl_setopt_array($ch, array(
        CURLOPT_HEADER => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CONNECT_ONLY => true,
    ));

    $content = curl_exec($ch);

    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return $status;
}

上の$statusに入る値は常に「0」になります。「CONNECT_ONLY」は伊達ではなく、レスポンスヘッダも返ってこないようです。
一応curl_exec()実行後にcurl_error()でエラーを確認することで、サイトへの接続自体は確認できますが、404や500が返ってきてもエラーは出してくれないため、使い物にならないでしょう。

ちなみに普通にcURLを実行した際に「0」が返ってきた場合、サイトへの接続が確立できないということになります。実行端末のネットワーク状態や、DNSの名前解決などを確認してみてください。

いい感じだった方法

CURLOPT_NOBODYを指定することで、リクエストメソッドがHEADになります。レスポンスヘッダのみが返されるので、curl_getinfo()CURLINFO_HTTP_CODEを指定することでステータスコードが取得できます。

function sendRequest($url) {
    $ch = curl_init($url);

    curl_setopt_array($ch, array(
        CURLOPT_HEADER => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_NOBODY => true,
    ));

    $content = curl_exec($ch);

    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return $status;
}

「リクエストメソッドがHEADになる」のがキモです。CURLINFO_HTTP_CODEを指定せず、取得した結果を捨てて出力しても見かけ上は同じに見えますが、実際はコンテンツを取得しに行ってしまうのでその分遅くなります。動画ファイルなどの大きいコンテンツに対して行うと分かりやすいです。

余談ですが、cURLは「カール」と読む方が多いようです。自分は「しーゆーあーるえる」と率直に読んでいたので、ちょっと恥ずかしくなってきました。
まあIT業界ではよくあることなので、気にしないようにします。

down

コメントする