1

get_headers()の PHP ドキュメントを見ると...

array get_headers ( string $url [, int $format = 0 ] )

... 実行するには 2 つの方法があります。

#1 ( format === 0)

$headers = get_headers($url);

// or

$headers = get_headers($url, 0);

#2 ( format !== 0)

$headers = get_headers($url, 1);

2つの違いは、配列が数値的にインデックス付けされているかどうかです(最初のケース)...

(ドキュメントからの抜粋)

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Sat, 29 May 2004 12:28:13 GMT
    [2] => Server: Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    ... etc

... またはキーでインデックス付け (2 番目のケース) ...

(ドキュメントからの抜粋)

Array
(
    [0] => HTTP/1.1 200 OK
    [Date] => Sat, 29 May 2004 12:28:14 GMT
    [Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
    ... etc

ドキュメントに記載されている例では、httpステータスコードは数値インデックスに属しています...

[0] => HTTP/1.1 200 OK

...何formatに設定されているかに関係なく。

同様に、私がこれまでに入力したすべての有効な URL get_headers(つまり、多くの URL ) では、複数のステータス コードが存在する場合でも、ステータス コードは常に数値インデックスの下にありました...

// Output from JSON.stringify(get_headers($url, 1))

{
    "0": "HTTP/1.1 301 Moved Permanently",
    "1": "HTTP/1.1 200 OK",
    "Date": [
        "Thu, 11 Aug 2016 07:12:28 GMT",
        "Thu, 11 Aug 2016 07:12:28 GMT"
    ],
    "Content-Type": [
        "text/html; charset=iso-8859-1",
        "text/html; charset=UTF-8"
    ]
    ... etc

しかし、私はすべての種類のサーバーですべての URL をテストしたわけではありません (読む:できません)。したがって、ステータス コード インデックスについて絶対的に話すことはできません。

非数値の http ステータス コード indexget_headers($url, 1)を返す可能性はありますか? それとも、常に数値インデックスの下にステータス コードを返すように関数にハードコードされていますか?


上記の質問に必要または不可欠ではない追加の読み物...

好奇心旺盛な方のために、私の質問は主に最適化に関するものです。GET の代わりにHEAD リクエストを送信したget_headers()場合でも、すでに非常に遅く、戻り配列を aと regex でくまなく調べた後にのみ悪化します。preg_match

(あなたが見つけるさまざまなCURLget_headers()メソッドはさらに遅いです.URLの非常に長いリストでそれらをテストしたので、ヒップショット、パートナーをホルスターしてください)

ステータス コードが常に数値でインデックス付けされていることがわかっている場合は、整数以外のインデックスをすべて無視してから、 . 1 つの URL の違いはほんの数分の 1 かもしれませんが、この関数を 1 日中、毎日実行すると、それらの小さなビットが加算されます。preg_match

さらに(編集#1)

私は現在、すべてのリダイレクトの後、最終的なhttp ステータス コード (および URL) についてのみ心配しています。これに似た方法を使用して、最終的な URL を取得していました。

走った後らしい

$headers = array_reverse($headers);

リダイレクト後の最終$headers[0]ステータス コードは常に in になります。しかし、繰り返しになりますが、これは、ステータス コードが数値でインデックス化されている場合にのみ確実です。

4

2 に答える 2

3

その関数の PHP C ソース コードは次のようになります。

        if (!format) {
no_name_header:
            add_next_index_str(return_value, zend_string_copy(Z_STR_P(hdr)));
        } else {
            char c;
            char *s, *p;

            if ((p = strchr(Z_STRVAL_P(hdr), ':'))) {
                ... omitted ...
            } else {
                goto no_name_header;
            }
        }

つまり、ヘッダーに a があるかどうかをテストし、ある:場合はその名前でインデックスを作成します (ここでは省略)。ない場合、または結果に:リクエストしなかった場合は、キックインして明示的なインデックスなしで追加します。$formatno_name_headerreturn_value

そのため、ステータス行に常に数値のインデックスを付ける必要があります。サーバーが:ステータス行に a を入力しない限り、これは異常です。RFC 2616は、ステータス行の理由句部分での使用を明示的に禁止していないことに注意してください。:

Status-Line    = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

Reason-Phrase  = *<TEXT, excluding CR, LF>

TEXT           = <any OCTET except CTLs,
                 but including LWS>

「:」を含む標準化された理由句はありませんが、ここでの慣習に反するエキゾチックなサーバーに出くわす可能性があることはわかりません…</ p >

于 2016-08-11T08:18:40.273 に答える