技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> PHP --> 两个 Header 的作用

两个 Header 的作用

浏览:2228次  出处信息

    其实这两个问题都是受 caoz 的一篇 blog 的启发

    当一个页面构建完成,到最后 echo 结果的时候,其实还有好几个问题值得考虑。caoz 的例子是,应该先释放掉 mysql 连接,因为 echo 的过程充满不确定性,如果用户机器慢(假设开了 BT 把带宽榨干了,或者各种各样的可能),PHP 是要等用户确实收到才执行完毕的,这个过程可能要数秒,或者干脆超时,导致 mysql 不能及时释放。

    注意,PHP 例子涉及到的环境包括 apache 2.2 / php 5.3.1 / ie 8 / curl。没在 fastcgi 下试过

    ETag

    虽然很早就知道 ETag,但我对 ETag 的认识一直局限于静态文件,比方说 Apache 里的 FileETag 参数。刚刚我才意识到有些动态文件也应该有 ETag,代价是给要 echo 的内容 crc32 一下,得到的回报是如果内容相同,你可以减少输出的内容,也就减少了流量和 PHP 的执行时间。这个提升很小,因此要看命中率来决定是否值得这么做,在某些特殊场合应该很有用。例如某些活动或热帖,会导致大量用户狂按 F5,或者某些页面本来就是 header("Cache-Control: no-cache") 的

    这个例子是保证页面每分钟只传输一次。

    $sDate = date("Y-m-d H:i");

    $sContent = "[ ETag ] ".$sDate."";

    $sETag = "\\"".hash("crc32", $sContent)."\\"";

    header("ETag: ".$sETag);

    settype($_SERVER["HTTP_IF_NONE_MATCH"], "string");

    if ($_SERVER["HTTP_IF_NONE_MATCH"] == $sETag) {

     header("HTTP/1.1 304 Not Modified");

     exit;

    }

    header("Content-Length: ".strlen($sContent));

    echo $sContent;

    ?>

    Content-Length

    如果指定了 Content-Length,则浏览器读到相应数量的内容后自己断开,而不是一直在等待完成。如果页面本身还要额外做些事情,例如向 mysql/memcache/其他什么接口 发送内容,明确指定 Content-Length 并 echo 完后再继续处理剩下的内容。

    下面这个例子中,是否注释掉 header 的结果完全不同

    $sDate = date("Y-m-d H:i:s");

    $sContent = "[ Content-Length ] ".$sDate."";

    header("Content-Length: ".strlen($sContent));

    echo $sContent;

    sleep(10);

    file_put_contents("access.txt", $sDate);

    echo " abc";

    ?>

    这跟我以前做过的一个接口很像,两边都走 web 访问,为了提高效率,如果是 add/set 之类的操作,发完 request 不等待 response(哪怕是空值也是要时间的),直接断开,而被请求的页面第一行就是 ignore_user_abort,好能完整的执行操作。因为没在 curl 里找到对应的功能,不得不直接 socket 写一个。

建议继续学习:

  1. Content-Type问题总结    (阅读:6102)
  2. php的echo为什么这么慢    (阅读:4111)
  3. 一个echo引起的进程崩溃    (阅读:3679)
  4. 加速PHP的ECHO    (阅读:2736)
  5. http header中缺少Content-Type导致$_POST为空    (阅读:2587)
  6. 简单的echo程序    (阅读:2249)
  7. ASM HEADER 备份与恢复    (阅读:1503)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1