这是我在学习php核心编程,自己学做的翻译。——芳芳
7.1 HTTP 连接
这篇文章将对WEB 服务器和浏览器之间的数据是怎样传递,做简单的讲解。如果您想知道更多的细节,请访问W3C 网站<http://www.w3.org/Protocols/ >.
当你在浏览器中输入URL 时,浏览器做的第一件事情是把URL 拆分为几个重要的部分,第一部分就是协议,HTTP 。第二部分是浏览器要连接的WEB 服务器。浏览器能明白从WEB 服务器传回的文档,就是通过HTTP 协议。在从WEB 服务器完成请求之前,浏览器先开启另外的线程发送HTTP 标头(header )信息。通过这个标头(header )信息,WEB 服务器能得知浏览器的牌子,浏览器能支持的文档类型。
WEB 服务器将这些标头(header )信息存入环境变量,以适合通用网关接口协议(CGI )。当一个PHP 代码开始执行的时候,PHP 把这些环境变量转成PHP 变量。其中最有用的标头(header )信息是浏览器的牌子和版本。WEB 服务器生成一个叫HTTP_USER_AGENT 的变量保存这些 标头(header )信息。同时,PHP 在数组_SERVER 中 增加一个索引名为HTTP_USER_AGENT 的元素。你可以用$_SERVER['HTTP_USER_AGENT'] 获取这个变量。如果你使用 Apache ,也可以用getallheaders 函数。它返回一个包含所有浏览器和服务器之间传输 标头(header )的数组。
当一个PHP 代码开始执行的时,HTTP 协议发送标头(header )信息给浏览器,但没有内容。这时,就是发送给浏览器额外的标头(header )信息的好机会,你可以请求浏览器缓存一个页面,或重定向一个页面。你可以用header 函数向浏览器发送 标头(header )信息。在以后的章节,我将讲解一些常用的应用。
PHP 把输出的标头(header )信息存入一个列表(list ),当PHP 开始发送内容信息时。这些标头(header )信息就会被清除。只要有内容信息发送,哪怕只是一个换行,再发送的标头(header )信息就会被丢失。这时如果你发送标头(header )信息,PHP 就会生产错误。你可以用headers_sent 函数测试发送 标头(header )信息到堆栈是否迟了,将代码控制在安全的范围。后面要讲到的 Cookies 也是用这种方法控制安全的。
当代码在执行和发送内容信息时,WEB 服务器会将输出缓存。每次的网络活动都会保存在内存暂存区,最后一起输出。WEB 服务器掌管缓存(buffer ),PHP 是不能控制缓存(buffer )的。但是,你可以用flush 函数请求缓冲——马上把代码执行结果输出。这对那些很长的代码是很有用的,用户和浏览器可以减少等待结果的时间,你可以让他们知道WEB 服务器通过缓冲正在处理。
有两种事件会让代码执行停止:当代码执行的时间太久了或用户点击了停止按钮。默认地,PHP 最久运行的时间是30 秒,你可以通过在php.ini 设置max_execution_time 改变这个值 。30 秒是个合适的值,如果你的代码一直执行,你应该让它停止。否则你的一些质量不佳的代码让你服务器的速度慢如龟爬。同样的道理,你也应该允许用户在等待太久时放弃请求。
有时你想让代码一直运行到完成,你可以命令PHP 忽略时间限制和用户停止。我将在15 章举例说明。我写过一些代码,执行了很多工作,曾运行了一个晚上。我允许那些代码运行运行一个小时或更久。ignore_user_abort 函数可以让你的代码在用户点击了停止按钮后还继续运行。
在运行一些特殊的代码时,你可能希望它停止而不是继续运行。用 register_shutdown_function 函数你可以在程序执行停止的时候执行一个特殊的函数。当程序正常停止的时候,这个函数也会执行。你可以用connection_aborted 和connection_timeout 这两个函数做正常/ 非正常停止的测试。我会在第九章讲解这两个函数。