繁体   English   中英

PHP - 用于get_headers($ url,1),是状态代码的键*总是*整数?

[英]PHP - for get_headers($url, 1), are the keys for status codes *always* integers?

查看get_headers()PHP文档 ...

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

...有两种方法可以运行它:

#1( format === 0

$headers = get_headers($url);

// or

$headers = get_headers($url, 0);

#2( format !== 0

$headers = get_headers($url, 1);

两者之间的区别在于数组是否被数字索引(第一种情况)......

(摘自文档

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

...或用键索引(第二种情况)......

(摘自文档

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 (即多个网址 ),状态码一直在数值指标,即使多个状态代码本...

// 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,因此不能绝对地谈论状态代码索引。

get_headers($url, 1)是否可能返回非数字http状态代码索引 或者它是否被硬编码到函数中以始终在数字索引下返回状态代码 - 无论如何?


额外阅读,对上述问题不是必要或必不可少的......

对于好奇,我的问题主要与优化有关。 get_headers()已经非常缓慢 - 即使在发送HEAD请求而不是GET时 - 并且只有在使用preg_match和regex梳理返回数组后才会变得更糟。

(你会发现各种各样的CURL方法甚至更慢,我已经使用很长的URL列表对get_headers()进行了测试,所以臀部拍摄,合作伙伴)

如果我知道状态代码总是用数字索引,那么在通过preg_match运行之前,我可以通过忽略所有非整数索引来加快我的代码。 一个URL的差异可能只是几分之一秒,但是当每天,每天都运行这个函数时,这些小部分就会加起来。

另外(编辑#1)

在重定向之后,我目前只担心最终的 http状态代码(和URL)。 我使用类似于的方法来获取最终的URL。

似乎跑完了之后

$headers = array_reverse($headers);

那么重定向后的最终状态代码将始终位于$headers[0] 但是,如果状态代码用数字索引,这只是一个肯定的事情。

函数的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;
            }
        }

换句话说,它测试标题中是否有:如果是,则继续按名称对其进行索引(这里省略)。 如果没有:或者如果你没有请求$format结果,则no_name_header启动并将其添加到return_value而没有显式索引。

所以,是的,状态行应该始终用数字索引。 除非服务器将:放入状态行,这将是不寻常的。 请注意, 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>

没有标准化的原因短语包含“:”,但你永远不会知道,你可能会在野外遇到异国情调的服务器在这里违反惯例......

由于响应代码始终为零索引,因此您可以关联地分配它并丢弃原始密钥。

$headers = get_headers($url,1);
$headers['Http-Response'] = $headers[0];
unset($headers[0]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM