IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

两个 Header 的作用

Soulogic 2010-02-23 13:43:24 累计浏览 2,885 次
本机暂存

    其实这两个问题都是受 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. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,253)
  2. 使用gettext来支持PHP的多语言 (累计阅读 39,270)
  3. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,401)
  4. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  5. Mysql监控指南 (累计阅读 21,352)
  6. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,408)
  7. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,523)
  8. 我的PHP,Python和Ruby之路 (累计阅读 13,150)
  9. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 13,058)
  10. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,791)