PHP の get_headers() は第 3 引数としてストリームコンテキストを受け取ります。PHP 8 では、HTTP URL のヘッダーチェックに独自のプロキシ設定を持たせられます:

$context = stream_context_create([
    'http' => [
        'proxy' => 'tcp://proxy.example.net:8080',
        'request_fulluri' => true,
        'method' => 'HEAD',
        'follow_location' => 0,
        'timeout' => 10,
    ],
]);

$headers = get_headers('http://example.net/file.zip', false, $context);
if ($headers === false) {
    throw new RuntimeException('Header request failed');
}

プロキシは HTTP ストリームラッパーの TCP エンドポイントです。この公開 HTTP チェックでは、プレースホルダーのホストとポートを HTTP プロキシ一覧の認証不要の候補に置き換えてください。request_fulluri は多くの転送プロキシが期待する形で、HTTP リクエスト行に完全な宛先 URI を渡します。このコンテキストはこの呼び出しに属し、他の URL 読み取りが使う既定のコンテキストを変えません。

関数名とは異なり、既定のリクエストメソッドは GET です。明示的な HEAD メソッドは、対応するレスポンスボディなしでレスポンスのメタデータをサーバーに要求します。サーバーは HEAD を拒否したり別扱いしたりすることがあるため、ヘッダーチェックの成功は後続のダウンロードの成功を保証しません。

ここでは最初のレスポンスを調べるためにリダイレクトの追跡を無効にしています。その場合 Location ヘッダーとリダイレクトステータスは、別の URL を取りに行く指示ではなく、有用な結果になります。チェックでリダイレクトを追うべきなら、その方針を意図的に変え、追加のレスポンスヘッダーを見込んでください。

false 引数はインデックス付きのヘッダー配列を保ちます。連想解析のほうが役立つ場合は true を使ってください。

関連記事