每次我用PHP创建网站或应用程序时,我必须使用header()函数将人们从一个页面重定向到另一个页面,但由于在我发现自己必须使用减慢页面速度的输出缓冲功能之前,几乎总是发送典型的标题.它要么是抑制"已发送标头"错误.我真的找不到任何可以在PHP中构建应用程序而不必违反这两者的示例.
我试图了解更多,关于如何在不使用输出缓冲的情况下重定向到页面.
这就是一些人认为是可能的.
prepare('SELECT * FROM users where username = ? AND password = ?'); $stmt->execute(array($_POST['username'], $_POST['password']); if($stmt->rowCount() == 0){ $stack_errors = 'error, username or password is incorrect'; }else{ $stack_errors = false; } }else{ $stack_errors = 'please enter username and password to log in'; } if(false === $stack_errors){ header('Location: /success.php'); exit; } ?>
一个编写良好的应用程序不应该有"太早"发送输出的问题,并导致PHP发出HTTP标头:
首先,可能会在处理输入和做出业务决策时发生可能导致重定向的决策; 在将任何内容输出到页面之前,此代码应完全完整.这确保您的类和函数只有一个责任,并允许您 - 至少在理论上 - 替换输出而不重写整个应用程序,例如创建机器可读的API版本.与您的评论相反,当您从事大型项目时,这一原则的重要性会增加.
其次,PHP本身可能会输出错误和警告,但应使用display_errors
ini设置在生产系统上关闭这些错误和警告.您不希望用户看到代码中每个错误的血腥细节 - 充其量,他们会判断它; 在最坏的情况下,他们会探测安全漏洞.
第三,其他人指出了PHP标签之外的杂散空白和编辑器添加的Unicode BOM的问题.追踪这些可能很棘手,但绝不是不可能的 - 一个不错的编辑器将具有显示空白的功能,并且无需BOM即可保存.不使用结束可以避免尾随空格?>
,因为它隐含在文件的末尾.如果使用gzip"输出过滤器",也会吞下少量输出; 这不会缓冲整个输出,但会一次缓冲几个字节,因此它有一些压缩的东西,所以给你一点点了.