优化PHP require_once用于低磁盘I / O?

时间:2010-03-31 17:57:12

标签: php optimization hard-drive opcode require-once

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

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

操作码缓存实际上比对一个带有var_export'd数据的php文件执行require_once更快吗?我的测试是不确定的,因为我的开发盒(XAMPP的5.3)一直在安装任何上述程序时抛出错误。

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

您对此有何看法和意见?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

看起来你根本不知道要缓存什么(以及为什么)。

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

答案 2 :(得分:0)

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

另外,请勿使用require_once。它明显慢于require。如果你没有使用自动加载器,你应该是。没有理由在现代php应用程序中手动包含文件(极少数例外)。

50-60个助手文件很疯狂。有没有办法将这些结合起来?你不能把它们都放在一个相关的帮助类中,比如OutputHelperCacheHelper吗?这样你只需要包括该类,再次,应该照顾你的自动加载器。听起来你正在做一些事情,比如为每个文件放一个函数。

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

答案 3 :(得分:-1)

我同意ryeguy。 require_once比require或include慢,因为它必须记录每个include并检查它。如果您只需要/ 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 Version 2将使用自动加载器。我相信这是最快的,也是最容易编码的。