odan / cache
0.5.0
2020-12-15 09:00 UTC
Requires
- php: ^7.2 || ^8
- psr/simple-cache: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2
- overtrue/phplint: ^2
- phpstan/phpstan: 0.*
- phpunit/phpunit: ^8 || ^9
- squizlabs/php_codesniffer: ^3
Provides
README
PSR-16 简单缓存实现。
即开即用的字节码缓存
PHP 是一种解释型语言。默认的 PHP 运行时将 PHP 源代码编译为称为 PHP 字节码的中间表示形式,然后执行。字节码缓存将此编译后的 PHP 源代码表示存储在共享内存中。这消除了在每个请求中加载和编译源代码的需要,从而显著提高了性能(每秒请求量增加多达 70%)。
执行 PHP 脚本的基本思想分为两步
- 第一步:将用纯文本编写的 PHP 代码 编译为操作码
- 第二步:执行那些 操作码。
当您有一个 PHP 脚本时,只要它没有被修改,操作码总是相同的;因此,每次执行该脚本时都进行编译阶段是一种浪费 CPU 时间。
为了防止这种重复编译,有一些操作码缓存机制可供使用。
一旦 PHP 脚本被编译为操作码,那些操作码将保存在 RAM 中,并且在下一次执行脚本时直接从内存中使用;从而防止了重复编译。
阅读更多
- https://blog.graphiq.com/500x-faster-caching-than-redis-memcache-apc-in-php-hhvm-dcd26e8447ad#.tsokdw9d4
- https://github.com/TerryE/opcache/wiki/The-Zend-Engine-and-opcode-caching#opcode-caching-with-opcache
要求
- PHP 7.2+ 或 8.0+
安装
composer require odan/cache
用法
$cachePath = sys_get_temp_dir() . '/cache'; $cache = new \Odan\Cache\Simple\OpCache($cachePath); // set a opcache value $cache->set('foo', 'bar'); // get a opcache value echo $cache->get('foo'); // bar
已知问题
致命错误:调用未定义的方法 stdClass::__set_state()
如果值中包含对象,它们将被写入为 stdClass::__set_state()
。这对于可以添加 __set_state()
的对象来说是正常的,但不能添加到 stdClass
。
要修复此问题,请序列化您要尝试缓存的值
$cache->set('key', serialize($object));
然后将字符串反序列化为原始值
$object = unserialize($cache->get('key'));
竞争条件
如果您处于高并发环境,应避免使用文件系统缓存。在 PHP 中,对文件系统的多次操作很难使其原子化。
类似组件
- laminas/laminas-cache - 查看文件系统适配器
- Symonfy Php Files Cache 适配器