PHP - 对于 get_headers($url, 1),状态代码的键*总是*整数吗?
PHP - for get_headers($url, 1), are the keys for status codes *always* integers?
正在查看 PHP docs for get_headers()...
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);
两者的区别在于数组是否有数字索引(第一种情况)...
(摘自docs)
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
... 或使用键索引(第二种情况)...
(摘自docs)
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
设置为什么。
类似地,在我通过 get_headers
(即 许多 URLs)输入的每个有效 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,因此不能绝对谈论状态代码索引。
get_headers($url, 1)
是否有可能 return 一个 非数字 http 状态代码索引 ?或者它是否被硬编码到函数中以始终 return 数字索引下的状态代码 - 不管怎样?
额外阅读,对上述问题不是必需的或不可或缺的...
出于好奇,我的问题主要与优化有关。 get_headers()
已经非常慢了 - 即使 sending a HEAD request 而不是 GET - 并且在使用 preg_match
和正则表达式梳理 return 数组后只会变得更糟。
(你会发现各种 CURL 方法甚至更慢,我已经用很长的 URL 列表针对 get_headers()
测试了它们,所以把那个臀部枪套起来,伙伴)
如果我知道状态代码总是数字索引,那么我可以通过忽略所有非整数索引,在 运行 通过 preg_match
将它们合并之前。一个 URL 的差异可能只有几分之一秒,但是当 运行 整天、每一天都在使用这个函数时,这些点滴加起来。
另外(编辑#1)
我目前只担心 final http 状态代码(和 URL),在所有重定向之后。我使用类似于 this 的方法来获得最终的 URL。
好像运行宁
之后
$headers = array_reverse($headers);
那么重定向后的 final 状态码将始终在 $headers[0]
中。但是,再一次,只有在状态代码是数字索引的情况下,这才是确定的。
PHP C source code for that function 看起来像这样:
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;
}
}
换句话说,它测试 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>
没有包含“:”的 standardised reason phrase,但你永远不知道,你 可能 在野外遇到违反惯例的奇异服务器......
由于响应代码始终为零索引,您可以关联分配它并丢弃原始密钥。
$headers = get_headers($url,1);
$headers['Http-Response'] = $headers[0];
unset($headers[0]);
正在查看 PHP docs for get_headers()...
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);
两者的区别在于数组是否有数字索引(第一种情况)...
(摘自docs)
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
... 或使用键索引(第二种情况)...
(摘自docs)
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
设置为什么。
类似地,在我通过 get_headers
(即 许多 URLs)输入的每个有效 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,因此不能绝对谈论状态代码索引。
get_headers($url, 1)
是否有可能 return 一个 非数字 http 状态代码索引 ?或者它是否被硬编码到函数中以始终 return 数字索引下的状态代码 - 不管怎样?
额外阅读,对上述问题不是必需的或不可或缺的...
出于好奇,我的问题主要与优化有关。 get_headers()
已经非常慢了 - 即使 sending a HEAD request 而不是 GET - 并且在使用 preg_match
和正则表达式梳理 return 数组后只会变得更糟。
(你会发现各种 CURL 方法甚至更慢,我已经用很长的 URL 列表针对 get_headers()
测试了它们,所以把那个臀部枪套起来,伙伴)
如果我知道状态代码总是数字索引,那么我可以通过忽略所有非整数索引,在 运行 通过 preg_match
将它们合并之前。一个 URL 的差异可能只有几分之一秒,但是当 运行 整天、每一天都在使用这个函数时,这些点滴加起来。
另外(编辑#1)
我目前只担心 final http 状态代码(和 URL),在所有重定向之后。我使用类似于 this 的方法来获得最终的 URL。
好像运行宁
之后$headers = array_reverse($headers);
那么重定向后的 final 状态码将始终在 $headers[0]
中。但是,再一次,只有在状态代码是数字索引的情况下,这才是确定的。
PHP C source code for that function 看起来像这样:
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;
}
}
换句话说,它测试 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>
没有包含“:”的 standardised reason phrase,但你永远不知道,你 可能 在野外遇到违反惯例的奇异服务器......
由于响应代码始终为零索引,您可以关联分配它并丢弃原始密钥。
$headers = get_headers($url,1);
$headers['Http-Response'] = $headers[0];
unset($headers[0]);