关于缓存
Opcode缓存
当一个 PHP 文件被解释执行的时候,首先是被编译成名为 opcode 的中间代码,然后才被底层的虚拟机
执行。 如果PHP文件没有被修改过,opcode 始终是一样的。这就意味着编译步骤白白浪费了 CPU 的资
源。
此时 opcode 缓存就派上用场了。通过将 opcode 缓存在内存中,它能防止冗余的编译步骤,并且在下次
调用执行时得到重用。设置 opcode 缓存只需要几分钟的时间,你的应用程序便会因此大大加速,实在没
有理由不用它。
PHP 5.5 中自带了 opcode 缓存工具,叫做OPcache,早期的版本也能通过一定的配置使用它
对象缓存
有时缓存代码中的单个对象会很有用,比如有些需要很大开销获取的数据或者一些结果集不怎么变化的数
据库查询。你可以使用一些缓存软件将这些数据存放在内存中以便下次高速获取。如果你获得数据后把他
们存起来,下次请求直接从缓存里面获取数据,在减少数据库负载的同时能极大提高性能。
许多流行的字节码缓存方案也能缓存定制化的数据,所以更有理由好好使用它们了。APCu、XCache 以
及 WinCache 都提供了 API,以便你将数据缓存到内存中
最常用的内存对象缓存系统是 APCu 和 Memcached 。APCu 对于对象缓存来说是个很好的选择,它提
供了简单的 API 让你能将数据缓存到内存,并且很容易设置和使用。APCu 的局限性表现在它依赖于所在
的服务器。另一方面,Memcached 以独立的服务的形式安装,可以通过网络交互,这意味着你能将数据
集中存在一个高速存取的地方,而且许多不同的系统能从中获取数据。
值得注意的是当你以 CGI(FastCGI) 的形式使用 PHP 时,每个进程将会有各自的缓存,比如说,APCu 缓
存数据无法在多个工作进程中共享。在这种情况下,你可能得考虑 Memcached 了,由于它独立于 PHP
进程。
通常 APCu 在存取速度上比 Memcached 更快,但是 Memcached 在扩展上更有优势。如果你不希望应
用程序涉及多个服务器,或者不需要 Memcached 提供的其他特性,那么 APCu 可能是最好的选择。
使用 APCu 的例子:
<?php // check if there is data saved as 'expensive_data' in cache $data = apc_fetch('expensive_data'); if ($data === false) { // data is not in cache; save result of expensive call for later use apc_add('expensive_data', $data = get_expensive_data()); } print_r($data);
注意在 PHP 5.5 之前,APC 同时提供了对象缓存与字节码缓存。APCu 是为了将 APC 的对象缓存移植到
PHP 5.5+ 的一个项目,因为现在 PHP 有了内建的字节码缓存方案 (OPcache)。