想必大家都应用过 memcached 或者 redis 这类的缓存零碎来做日常的缓存,或者用来抗流量,或者用来保留一些罕用的热点数据,其实在小我的项目中,PHP 也曾经为咱们筹备好了一套简略的缓存零碎,齐全可能应酬咱们日常一般规模站点的开发。这一套扩大就是 APCu 扩大。
APCu 扩大
APCu 扩大是 APC 扩大的降级,APC 扩大曾经不保护了。这两套扩大其实都是基于 opcode caching。也就是 PHP 本身的 opcode 来实现的缓存能力。
APCu 的装置就和一般的 PHP 扩大一样,非常简单,最次要的是这个扩大还十分的小。不论下载还是装置都是秒级能够实现的。所以说可能十分不便的利用于小规模的我的项目,而且是 PHP 原生反对的,不须要额定的端口之类的配置。
办法阐明
缓存零碎个别都会有的减少、删除、查问、自增等性能都在 APCu 扩大中有对应的实现。
- apcu_add — 创立一个新的缓存
- apcu_cache_info — 查看 APCu 的全副缓存信息
- apcu_cas — 更新一个缓存的值为新值
- apcu_clear_cache — 革除全副的缓存
- apcu_dec — 自减缓存值
- apcu_delete — 删除一个缓存的内容
- apcu_enabled — 以后环境下是否启用 APCu 缓存
- apcu_entry — 原子地生成一个缓存实体
- apcu_exists — 查看缓存是否存在
- apcu_fetch — 查问缓存
- apcu_inc — 自增缓存值
- apcu_sma_info — 查问缓存的共享内存信息
- apcu_store — 保留一个缓存
应用演示
apcu_add("int", 1);
apcu_add("string", "I'm String");
apcu_add("arr", [1,2,3]);
class A{
private $apc = 1;
function test(){echo "s";}
}
apcu_add("obj", new A);
var_dump(apcu_fetch("int"));
var_dump(apcu_fetch("string"));
var_dump(apcu_fetch("arr"));
var_dump(apcu_fetch("obj"));
失常的应用都是比较简单的,咱们增加各种类型的数据都能够失常存入缓存。不过须要留神的是,咱们能够间接保留对象进入 APCu 缓存中,不须要将它序列化或者 JSON 成字符串,零碎会主动帮咱们序列化。
apcu_add(string \$key , mixed $var [, int $ttl = 0]) 办法就是一般的增加一个缓存,$ttl 能够设置过期工夫,也是以秒为单位,如果不设置就是长期有效的。留神,APCu 的缓存时限在一次 CLI 中无效,再调用一次 CLI 取不到上次 CLI 中设置的缓存内容。而在 PHP-FPM 中,重启 PHP-FPM 或 FastCGI 之后缓存会生效。
接下来咱们重点测试一下几个不太常见的办法。
apcu_cas("int", 1, 2);
var_dump(apcu_fetch("int"));
// Warning apcu_cas() expects parameter 2 to be int
apcu_cas("string", "I'm String","I'm New String");
apcu_cas(string $key , int $old , int $new) 是将一个 $old 值批改为 $new 值,它只能批改数字类型的内容,如果是字符串的批改会报错。这个函数有什么劣势呢?它最大的劣势是原子性的,也就是不受高并发的影响。与之类似的是 apcu_store(string $key , mixed $var [, int $ttl = 0]) 办法,不过这个办法只是简略的批改一个缓存的内容,如果这个缓存的键不存在的话,就新建一个,它不受类型的限度,当然也不具备原子性。
apcu_entry("entry", function($key){return "This is" . $key;});
var_dump(apcu_fetch("entry"));
apcu_entry(string $key , callable $generator [, int $ttl = 0]) 这个函数的作用是如果 $key 这个缓存不存在,则执行 $generator 这个匿名函数,并将 $key 做为键值传递进去,而后生成也就是 return 一个内容做为这个缓存的值。
var_dump(apcu_cache_info());
最初,如果咱们想查看以后零碎中的所有 APCu 缓存信息的时候,间接用这个 apcu_cache_info() 函数即可。
总结
当缓存中的数据十分多时,它还提供了一个 APCUIterator 迭代器不便咱们进行缓存信息的循环查问及相干统计。总之,这一套零碎是十分不便的一套小规模的缓存零碎,在日常开发中齐全能够尝试用到一些小性能上。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202004/source/%E6%88%91%E4%BB%AC%E4%B9%9F%E6%9C%89%E8%87%AA%E5%B8%A6%E7%9A%84%E7%BC%93%E5%AD%98%E7%B3%BB%E7%BB%9F%EF%BC%9APHP%E7%9A%84APCu%E6%89%A9%E5%B1%95.php
参考文档:
https://www.php.net/manual/zh/function.apcu-entry.php
各自媒体平台均可搜寻【硬核项目经理】