我使用对象缓冲来使用ob_start('ob_gzhandler');
来缓冲我的php页面的输出。
这是否会影响存储在CDN中的文件的性能?
提出这个问题的原因是因为,其中一个网站指出了以下关于“输出缓冲是一种大大提高PHP脚本性能和速度的简单方法。没有输出缓冲,你的脚本将显示HTML处理的页面 - 分段。添加输出缓冲允许PHP将HTML存储为变量并将其发送到一个块中的浏览器。“
请你澄清一下吗?
答案 0 :(得分:8)
使用ob_start
肯定会影响页面的加载时间 - 不“PHP脚本的性能”,这是恕我直言,这是一个完全误导的表达。但是让我们从一开始就采取行动。
您提到的那一方似乎是指用户所感知的页面加载时间。也就是说,假设您有10KB的HTML要发送,并且您每50ms发送1KB。还假设浏览器没有在过程中放置任何自己的逻辑,它只是尽可能快地读取传入的数据(肯定不是真的!)。 50ms的长度足以被人类感知,因此用户将看到逐页加载的页面。
另一方面,假设所有10KB的HTML在500ms后一次性发送。虽然这会导致用户等待相同的总时间,但页面将一举渲染,用户会将其视为更快,因为“它花费的时间更少” ”
我还应该提一下,如果你采用完全相同的例子并将加载时间增加到5秒(或10秒.5秒),则用户感知将被颠倒:现在第二页更慢< / em>因为“花了这么长时间才开始”。
显然,这种分析很好地融入了心理学的领域,所以我要停在这里,并建议如果你对这些东西感兴趣,网上有很好的资料。这就是浏览器做在接收数据时呈现页面的过程中放入自己的特殊酱料的原因:每个供应商都想让他们的浏览器感觉更快,甚至虽然就网络而言,它们都同样快速。
我们也考虑服务器端。 Web服务器堆栈上的任何东西 - Apache,PHP,介于两者之间的任何东西 - 也可以选择在发送之前缓冲数据。通常情况下,即使没有明确记录或开发人员请求,也会发生这种情况,这就是为什么您会看到应该显示“已发送标头”的代码的通知不会这样做。
现在,如果您在服务器端缓冲内容,那么您真正在做的是强制浏览器调整以了解事情应该如何运作。让我们回到客户端渲染示例,并考虑一个以小块接收HTML的浏览器,但选择延迟渲染以显示更快捷的。这样做并不意味着浏览器在延迟期间必须 nothing ;实际上,它很可能解析 HTML并立即开始加载依赖项(样式表,图像等),即使它还不打算呈现页面。这是合乎逻辑的:通过提前做好,最终可以获得这些资产的内容,并赢得“感知速度”战争。
问题是,如果你假设军事命令缓冲浏览器就不能再那样做了。它必须等待内容发送,然后开始寻找这些资产。由于我们正在谈论CDN,如果不是即时的(由于缓存),获取资产将非常快,但这仍然是一个小到零的延迟,你不必受苦。
当然,我们必须考虑到输出缓冲以实现压缩可以使页面实际加载更快,因为只需要发送更少的数据。对于连接速度慢的人来说,这种差异尤其明显。
如果您已经测量到压缩对页面加载的速度有很大影响,那么请使用它。如果您不进行压缩,请不要试图猜测浏览器供应商(他们在研究上花费了大量资源)根据未知凭据的网站建议。
答案 1 :(得分:2)
使用php生成页面时,会生成一个文本文件,通常使用echo来呈现html。因此,将发送给客户的输出页面是在“回声”的节奏中创建的。
当您在内存缓冲区中使用缓冲回显时(例如,可以使用ob_get_content调用下一个)。当您需要为客户端提供输出时,您可以在一次操作中打印出缓冲区的内容。
所以简单来说:默认输出的写操作很慢,但是内存缓冲区中的写操作更快。因此,您在内存缓冲区中渲染,然后在默认输出上回显块,您将提高输出速度。
另一个好处是它允许您创建自定义缓存系统的方式。
我不知道您使用的是什么CDN,但如果要存储图像,则不会受到php缓冲的影响。
答案 2 :(得分:1)
这个答案并不是要解释ob_start的作用,它只是一个基准
我刚刚在我自己的网站上进行了一些测试,每个请求加载了大约70个PHP文件并进行了一些MySQL查询
Size|Finish|DOM Loaded|Load
//Procedural output
16 KB 543 ms 440 ms 544 ms
-- 598 ms 465 ms 599 ms
-- 604 ms 469 ms 604 ms
-- 598 ms 474 ms 599 ms
-- 595 ms 465 ms 596 ms
-- 595 ms 465 ms 596 ms
//echo ob_get_clean();
-- 1140 ms 740 ms 1140 ms
-- 852 ms 654 ms 853 ms
-- 7xx ms 5xx ms 7xx ms
-- 8xx ms 6xx ms 8xx ms
-- 7xx ms 5xx ms 7xx ms
-- 8xx ms 6xx ms 8xx ms
在我的情况下,它会影响很多加载时间(PHP 7.1)
答案 3 :(得分:0)
使用ob_start()
不会影响使用CDN时的性能。 CDN将在您从您的网站获取内容后提供您的内容。您使用ob_start()
这一事实将是透明的。您使用ob_gzhandler的事实将由CDN看到,但不会影响其自身的性能。
CDN会向您的网站询问内容。它将被压缩(使用ob_gzhandler)或未压缩。如果客户端要求,CDN会将其压缩(大多数浏览器都会这样做)。