2

Q1) 我正在设计一个CMS(-谁不是!)但优先考虑缓存。从字面上看,一切都被缓存了。数据库行、数据库 ID 查询、配置数据、已处理数据、已编译模板。目前它有两层缓存。

第一个是操作码缓存或内存缓存,例如 apc、eaccelerator、xcache 或 memcached。如果在那里找不到条目,​​则在二级慢速缓存中搜索它,即 php 包含。

操作码缓存实际上是否比对其中包含 var_export 数据数组的 php 文件执行 require_once 更快?我的测试没有定论,因为我的开发箱(XAMPP 的 5.3)在安装上述任何程序时不断抛出错误。

Q2) CMS 有许多按需自动加载的辅助类,而不是加载所有文件。大多数情况下,每个都在它之前有一个要求,因此不需要进行自动加载,但这不是问题。因为一个页面脚本可以包含多达 50/60 个帮助文件,所以我有一种感觉,如果站点处于压力之下,它会因为所有的 i/o 而崩溃。暂时忽略有输出缓存可以消除对我将要建议的内容的需求,并且操作码缓存也会使这个问题变得没有意义。我试图做的是将脚本执行所需的所有帮助文件加入一个文件中。这是可以实现的并且运行良好,但是它具有显着增加内存使用量的副作用,即使在技术上使用相同的代码也是如此。

您对此有何想法和看法?

4

4 回答 4

1

使用像 APC 这样的编译器缓存应该会有所帮助,因为它会在您的帮助文件转换为操作码后缓存它们。这意味着这些文件不仅会被缓存,而且已经在操作码中,因此每次需要它们时都不需要对其进行解析和编译。

于 2010-03-31T18:11:03.107 回答
1

看起来您只是不知道要缓存什么(以及为什么)。

您只是无法比较“操作码缓存”和“require_once”。操作码缓存将缓存所需的代码以及其他代码。

于 2012-02-18T14:35:46.927 回答
0

首先,请记住,如果访问足够频繁,您的操作系统会将文件缓存在内存中。

另外,不要使用require_once. 它明显慢于require. 如果您不使用自动装载机,则应该使用。没有理由在现代 php 应用程序中手动包含文件(极少数例外)。

50-60 个帮助文件太疯狂了。没有办法把这些结合起来吗?你不能把它们都放在一个相关的帮助类中,比如OutputHelperorCacheHelper吗?这样你只需要包含这个类,同样,你应该照顾你的自动加载器。在我看来,您正在做一些事情,例如为每个文件放置一个函数。

操作码缓存大大降低了内存使用和执行速度,但我不确定它对require语句有什么影响。

于 2010-03-31T18:05:16.480 回答
-1

我同意黑麦。require_once 比 require 或 include 慢,因为它必须记录每个包含并检查它。如果你只做一个要求/包含(你应该为类),那么你不需要 require_once 或 include_once。

自动加载非常适合优化。因为您只会在需要时加载类。因此,如果您的应用程序有 500 个类,但只需要 15 个类即可运行某个页面/脚本。然后只有那 15 个被加载。这很好。

如果您在任何大型框架上达到顶峰。您会注意到他们已经迁移到使用自动加载器。他们习惯在最后一刻使用 require_once,就像 Zend Framework Version 1 中的这个例子一样。

require_once 'Zend/Db/Exception.php';
throw new Zend_Db_Exception('Adapter name must be specified in a string');

Zend Framework 版本 2 将改为使用自动加载器。我相信这是最快的,也是最容易编写代码的。

于 2012-02-18T14:00:05.830 回答