15. 缓存
PHP本身速度非常快,但当您进行远程连接、加载文件等时,可能会出现瓶颈。当然,如今有各种工具可用于加速应用程序的某些部分,或减少这些耗时任务需要运行的次数,从而达到加载速度更快!
操作码缓存
当执行PHP文件时,它必须首先编译成操作码(CPU的机器语言指令)。如果源代码不变,则操作码将是相同的,因此此编译步骤将成为CPU资源的浪费。
操作码缓存通过将操作码存储在内存中并在连续调用时重用它们来防止冗余编译。它通常会首先检查文件的签名或修改时间,以防有任何更改。
操作码缓存可能会显著提高应用程序的速度。自PHP5.5以来,有一个内置版本-Zend OPcache. 根据您的PHP包/发行版的不同,它通常在默认情况下打开-检查opcache.enable以及phpinfo()
的输出以确保。对于早期版本,有一个PECL扩展。
阅读有关操作码缓存的更多信息:
-Zend OPcache(从5.5开始与PHP捆绑)
-Zend OPcache(以前称为Zend Optimizer+)现在是开源
-APC-PHP5.4及更早版本
-XCache
-WinCache(MS Windows Server的扩展)
-维基百科上的PHP加速器列表
-PHP预加载-PHP>=7.4
对象缓存
有时缓存代码中的单个对象会很有用,比如有些需要很大开销获取的数据,或者一些结果集不怎么变化的数据库查询。你可以使用对象缓存软件将这些数据存放在内存中以便下次高速获取。如果你获得数据后把它们存起来,下次请求直接从缓存里面获取数据,可以显著提高性能并降低数据库服务器的负载。
许多流行的字节码缓存方案也能缓存自定义的数据,所以更有理由好好使用它们了。 APCu 、XCache 以及 WinCache 都提供了 API,以便你将PHP代码中的数据缓存到内存中。
最常用的内存对象缓存系统是 APCu 和 Memcached 。APCu 是对象缓存的绝佳选择,它提供了简单的 API 让你能将数据缓存到内存,并且相当容易设置和使用。APCu 最大的局限性在于,它与所在的服务器绑定。Memcached 能够以独立的服务的形式安装,通过网络进行访问,这意味着你能将对象集中存储在超高速存取数据的中心节点,许多不同的系统能从中获取数据。
需要注意的是,当 Web 服务器以 CGI(FastCGI)应用程序形式运行 PHP 时,每个 PHP 进程将会有各自独立的缓存,也就是说,APCu 缓存数据无法在多个工作进程中共享。在这种情况下,你可能得考虑使用 Memcached 了,由于它是独立于 PHP 进程的。
在网络配置中,通常 APCu 在访问速度方面优于memcached,但 memcached 在扩展上更有优势。如果你的的应用程序不需要运行在多台服务器上,或者不需要 memcached 提供的其他特性,那么 APCu 应该是对象缓存的最佳选择。
使用 APCu 的范例:
<?php
// 检查缓存中是否已经存有‘expensive_data’的数据
$data = apc_fetch('expensive_data');
if ($data === false) {
//数据不在缓存中;把这个高开销的请求结果缓存起来,供后面使用
apc_add('expensive_data', $data = get_expensive_data());
}
print_r($data);
注意,在 PHP 5.5 之前,APC 同时提供了对象缓存和字节码缓存两种。APCu 是一个将 APC 的对象缓存引入 PHP 5.5+ 的项目,因为 PHP 目前已经有了内置的字节码缓存(OPcache)。
更多流行的对象缓存系统:
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。