有选择地还是全球?

时间:2012-08-27 20:16:29

标签: php performance include server-side-includes

有了这个问题,我的目标是更好地理解PHP的内部工作原理。

假设你有一个50K的库。该库加载了一堆方便的函数,您可以在这里使用它们。还假设您网站的10%页面需要/使用这些功能。但是你的主页肯定需要它。

现在,问题是......如果您使用指向此库的全局包含 - 全面 - 以便所有页面(包括不需要库的90%)将获得它,或者应该您是否有选择地仅在您需要的页面上添加包含引用?

在回答这个问题之前,请指出"为什么"我问这个问题......

当您包含该引用时,PHP可能正在缓存它。所以我担心的性能可能是一次性交易,而不是每次。一旦一次完成,后续加载可能不会像人们想象的那么糟糕。这完全是因为PHP部署的智能缓存机制 - 我对此并不十分了解,因此问题......

既然首页需要该库,那么争论可能就是为什么不将该库温暖和新鲜保留在内存中并让它全面服务?

在回答这个问题时,请严格从缓存/性能的角度来处理问题,而不是从方便的角度来看,只是为了避免讨论转向编程风格以及做什么和不要&# 39,TS。

谢谢

3 个答案:

答案 0 :(得分:1)

测量它,然后你知道。

第一次点击后可能会有一些缓存优势,因为操作系统也会缓存它,但是只保存I / O命中(授予,这不是什么都没有)。但是,您仍然会受到处理。如果将50K代码包含在“Hello World”页面中,即使您没有执行任何代码,您仍将支付CPU和内存代价来加载和解析该50K的源代码。处理的那部分很可能不会以任何方式缓存。

一般来说,CPU今天非常便宜,所以可能不值得“节省”。但这就是为什么你需要实际测量它,所以你可以自己决定。

答案 1 :(得分:1)

我认为你所指的缓存是来自APC之类的操作码缓存?所有这一切都是为了防止PHP每次都需要解释源代码。你仍然需要为每个包括一些点击或要求你使用。一种范例是废弃程序功能并使用通过__autoload()加载的类。这使得大型应用程序的按需策略变得简单。同意威尔,如果您担心,您应该对此进行衡量。过早优化从来没有帮助。

答案 2 :(得分:1)

我非常感谢您对表现的担忧。

简短的回答是,为了获得最佳性能,我可能会有条件地将文件仅包含在需要它的页面上。

PHP的操作码缓存会以缓存的形式维护两个包含文件,因此您不必担心保持缓存温度"就像使用其他类型的缓存一样。缓存将保留,直到存在内存限制(50K脚本不存在问题),源文件更新,手动清除缓存或服务器重新启动。

也就是说,操作码(PHP字节码)缓存只是PHP解析过程的一部分。每次运行脚本时,都会处理字节码以构建在脚本中定义和可选使用的函数,类,对象和其他实例变量。这一切都加起来。

在这种情况下,简单的更改可以显着提高性能。绿色,每个周期都很重要:))