我已经对 php include() 的各种成本进行了一些测试,我想分享一下,因为我看到许多程序员或 CMS 平台忽略了这些运行前 php 成本。
函数本身的成本可以忽略不计。 100 个文件包含(带有空文件)大约需要 5 毫秒;使用 opcache 时不超过一微秒。
因此,与包含 100 个单独的文件相比,包含 100 个类的较大 php 文件所节省的成本仅为 5 毫秒左右。使用 OpCode 缓存使成本变得无关紧要。
真正的成本取决于文件的大小,以及 PHP 必须解析和/或编译的内容。为了更好地了解这些成本是多少,以下是我在 2010 Mac Mini Server 上进行的测试结果,该服务器具有 10,000 RPM 驱动器,运行 PHP 5.3 并启用了优化器的 eAccelerator opcache。
1µs for 100 EMPTY File includes, w/opcache
5ms for 100 EMPTY File includes, no opcache
7ms for 100 32KB File includes, w/opcache
30ms for 100 32KB File includes, no opcache
14ms for 100 64KB File includes, w/opcache
60ms for 100 64KB File includes, no opcache
22ms for 100 128KB File includes, w/opcache
100ms for 100 128KB File includes, no opcache
38ms for 100 200KB File includes, w/opcache
170ms for 100 200KB File includes, no opcache
因此,一个 600KB 的 php 文件大约需要 6 毫秒,使用操作码缓存时大约需要 1 毫秒。相反,您真正想看的是每个请求包含的所有代码的大小。
合并文件以尝试节省资源绝对不是一个好主意,并且在使用操作缓存时会出错。我的测试根本没有考虑磁盘速度,因为我包含了同一个文件 100 次。也就是说,我觉得根本不需要讨论磁盘 I/O,因为安装 op-cache 确实是基本性能的先决条件。
要尽可能提高性能并节省 RAM 使用量,必须采取相反的做法。使用自动加载器或类工厂模式尽可能多地根据上下文拆分文件,以尽可能少地为每个请求包含未使用的代码。
为此,misusing include_once() 也可能对性能产生负面影响...
关于您的基类。我也有类似的情况,但我只包含了表架构的一小部分。主要是字段类型和主键细节。出于性能原因,我故意不一直包含这些表的相当繁重的模式,因为它们很少使用,当它们被使用时,我每个请求最多只使用其中的几个。
表的平均完整列详细信息大约为每个模式数组 20-50k。在任何给定的请求中包括 10-15 个,阵列的成本仅为 1-3 毫秒。这本身并不多。但是,当与每个请求节省 500k RAM 相结合时,它就变得值得了。