有人可以向我解释PHP是如何运作的吗? 假设我们有这样的代码:
<?php
echo "line1 <br />";
echo "line2 <br />";
setcookie("TestCookie", "test");
echo "line3 <br />";
echo "line4 <br />";
当脚本逐行处理脚本时,是否将脚本发送到客户端(浏览器) 浏览器首先接收“line1”,呈现它,然后“line2”,呈现它等等?或者所有脚本的输出都在某处缓冲并在处理完脚本后立即发送所有内容?
答案 0 :(得分:1)
这里(其他人)和互联网上都很好地解释了echo
。我在使用cookies方面遇到了麻烦,所以我会解释一下:
Cookie是标题(您可以查找)。标题可以发送给用户(内容长度,cookie数据等)。用户还会发回标题(IP,post params,cookies)。标题出现在正文之前,这就是在任何输出之前必须调用setcookie
的原因。
所以你设置了cookie。用户在加载页眉时会收到cookie。当他们请求另一个页面时,他们会发回cookie数据,这就是您只能在后续请求中检查$_COOKIE[whatever]
的原因。 $_COOKIE
访问当前请求的标头和Cookie。当您执行setcookie
时,您只向用户发送下一个请求的Cookie,但它们不会出现在当前请求中。
答案 1 :(得分:1)
当PHP按顺序执行每一行时,输出通常是缓冲的。
PHP echo statement或者直接将输出发送到Web服务器后端或“用户空间”output buffer。输出缓冲区的大小可以不同,可以堆叠在其他输出缓冲区之上,并用于实现gzip compression等过滤器。
可以启用用户空间输出缓冲by PHP code和/或by the PHP configuration (INI) file。编写代码的方式实际上是必要的,因为PHP只能发送响应头,包括Set-Cookie头,before the response body。 Various functions存在要添加,获取内容和删除用户空间输出缓冲区。
Web服务器后端也可以包含自己的缓冲;要刷新该缓冲区,除非在生成输出之前调用flush(),否则必须调用ob_implicit_flush()。尽管名称如此,ob_implicit_flush()确实不刷新用户空间缓冲区。
出于性能原因,存在两种输出缓冲区,除非有很好的理由(例如,您需要执行实时输出),因此不应禁用它们。