Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的头文件使用_Php_Header_Http Headers - Fatal编程技术网

PHP中的头文件使用

PHP中的头文件使用,php,header,http-headers,Php,Header,Http Headers,非常简单的问题:这两个PHP(Version5+)头调用中哪一个是“最好的” 我很确定第一个是最多价的,但我只是好奇如果在HTTP 1.0下,PHP是否会“修复”第二个 谢谢 编辑:其中一个标题会使我的Web主机上的PHP崩溃。跟进问题: 我选择第二个,因为http响应代码参数只支持>=PHP4.3.0(这可能会影响代码的可移植性) 我已经这样做过很多次,没有遇到任何不支持HTTP/1.1的客户端,因此,除非您有特殊情况,否则我认为这永远不会是一个问题。关于第一个标头调用的行为,有两件事值得指出

非常简单的问题:这两个PHP(Version5+)头调用中哪一个是“最好的”

我很确定第一个是最多价的,但我只是好奇如果在HTTP 1.0下,PHP是否会“修复”第二个

谢谢

编辑:其中一个标题会使我的Web主机上的PHP崩溃。跟进问题:

我选择第二个,因为http响应代码参数只支持>=PHP4.3.0(这可能会影响代码的可移植性)


我已经这样做过很多次,没有遇到任何不支持HTTP/1.1的客户端,因此,除非您有特殊情况,否则我认为这永远不会是一个问题。

关于第一个标头调用的行为,有两件事值得指出:

  • 如果提供第3个参数,PHP将忽略第一个字符串参数,并发送给定数字的正确响应。这可能会降低第一种方法发生程序员错误的可能性
  • PHP似乎用HTTP/1.1响应,即使请求是用HTTP/1.0发出的

我通常会使用第二个示例—然而,最近使用apachebench对应用程序进行基准测试时,我们注意到ab经常挂起

调试后,发现此样式的标头:

header('HTTP/1.1 304 Not Modified')
是罪魁祸首(是的,我不知道),在把它改成

header('Not Modified', true, 304);
信不信由你ab开始工作了。很奇怪,但值得一想。接下来我可能会使用第二种方法

我会用这个:

header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified', true, 304);
包含请求中使用的协议,如
HTTP/1.0
HTTP/1.1


编辑我不得不承认我的建议毫无意义。在几次测试之后,我注意到,如果第一个参数是有效的,PHP将使用该状态行,而不管第二个状态代码是否和第三个参数是什么。第二个参数(它替换的文档名称)也没用,因为不能有多个状态行

因此,此调用中的第二个和第三个参数是冗余的:

header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified', true, 304);
请使用以下方法:

header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');

我认为秋葵的回答是迄今为止最明智的。但是,请尝试以下方法:

<?php
header('Gobbledy Gook', true, 304);
?>
<?php
header('Cache-Control: max-age=10', true, 304);
?>


如果第一个字符串不是正确的头,它将被丢弃。如果iy看起来确实像一个有效的标题,它将被附加到标题中-请尝试以下操作:

<?php
header('Gobbledy Gook', true, 304);
?>
<?php
header('Cache-Control: max-age=10', true, 304);
?>

header()的手册,并注意特殊情况-一般来说,我认为依靠这种内置的启发式方法是不可取的

然而,我猜想您实际上对通过代理/浏览器缓存好内容感兴趣。在大多数情况下,延迟比带宽更重要。接下来考虑浏览器在缓存内容是否过时时的行为——在没有更新的缓存信息的情况下,它不断重复请求服务器以查看内容是否仍然过时。
也就是说,在大多数情况下,忽略请求的条件部分(或者更好地在Web服务器上剥离它们)实际上可以提高性能。

为了将来的参考,http_response_code()函数将出现在5.4中:

另一种选择是:

if (!function_exists('http_response_code')) {
    function http_response_code($code = NULL) {

        if ($code !== NULL) {

            switch ($code) {
                case 100: $text = 'Continue'; break;
                case 101: $text = 'Switching Protocols'; break;
                case 200: $text = 'OK'; break;
                case 201: $text = 'Created'; break;
                case 202: $text = 'Accepted'; break;
                case 203: $text = 'Non-Authoritative Information'; break;
                case 204: $text = 'No Content'; break;
                case 205: $text = 'Reset Content'; break;
                case 206: $text = 'Partial Content'; break;
                case 300: $text = 'Multiple Choices'; break;
                case 301: $text = 'Moved Permanently'; break;
                case 302: $text = 'Moved Temporarily'; break;
                case 303: $text = 'See Other'; break;
                case 304: $text = 'Not Modified'; break;
                case 305: $text = 'Use Proxy'; break;
                case 400: $text = 'Bad Request'; break;
                case 401: $text = 'Unauthorized'; break;
                case 402: $text = 'Payment Required'; break;
                case 403: $text = 'Forbidden'; break;
                case 404: $text = 'Not Found'; break;
                case 405: $text = 'Method Not Allowed'; break;
                case 406: $text = 'Not Acceptable'; break;
                case 407: $text = 'Proxy Authentication Required'; break;
                case 408: $text = 'Request Time-out'; break;
                case 409: $text = 'Conflict'; break;
                case 410: $text = 'Gone'; break;
                case 411: $text = 'Length Required'; break;
                case 412: $text = 'Precondition Failed'; break;
                case 413: $text = 'Request Entity Too Large'; break;
                case 414: $text = 'Request-URI Too Large'; break;
                case 415: $text = 'Unsupported Media Type'; break;
                case 500: $text = 'Internal Server Error'; break;
                case 501: $text = 'Not Implemented'; break;
                case 502: $text = 'Bad Gateway'; break;
                case 503: $text = 'Service Unavailable'; break;
                case 504: $text = 'Gateway Time-out'; break;
                case 505: $text = 'HTTP Version not supported'; break;
                default:
                    exit('Unknown http status code "' . htmlentities($code) . '"');
                break;
            }

            $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');

            header($protocol . ' ' . $code . ' ' . $text);

            $GLOBALS['http_response_code'] = $code;

        } else {

            $code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);

        }

        return $code;

    }
}
在本例中,我使用$GLOBALS,但您可以使用任何您喜欢的存储机制。。。我认为没有办法返回当前状态代码:

参考我从PHP源代码中获得的错误代码:

以及当前http标头的发送方式及其使用的变量:


您为什么关心php4的兼容性?你不使用对象(或者以非常有限的方式使用它们)吗?事实上,我认为PHP 4冷死了。我不再在我的任何脚本中支持PHP<5,但仍然有大量的PHP4服务器,因此如果需要代码的可移植性,那么这是一个考虑因素。为什么你仍然关心HTTP/1.0?是的,我知道有很多PHP4服务器,但我只是不使用/支持它们。我不希望PHP4成为另一个IE6。。。我并不真正关心HTTP 1.0,但因为我可以控制我运行的PHP版本,而不是查询中使用的HTTP版本,所以我更喜欢使用与查询相同的“语言”来回答。似乎第一点不是真的(至少对我的Web主机来说),因为我得到了“backend:malformed header from script.Bad header=not Modified:index.PHP”……奇怪。。。我的主机在使用头时崩溃,错误为500('notmodified',true,304);(我收到错误“backend:malformed header from script.Bad header=Not Modified:index.php”)。“如果第一个字符串不是正确的头,它将被丢弃。如果iy看起来像一个有效的头,它将被附加到头中”您确定吗?当我使用标题时('notmodified',true,304);我收到错误“backend:script.Bad header=Not Modified:index.php中的格式错误的头”是因为这个吗?