【发布时间】:2018-04-13 23:09:12
【问题描述】:
最近我把CakePHP 3.2项目移到了虚拟主机上(CentOS、php 7.0/5.6都试过了,OpCache启用了),发现查询结果缓存不起作用。
我为导航菜单使用默认文件缓存引擎。
$mt = TableRegistry::get('MenuItems');
$menu = $mt->find('active')
->select([
"MenuItems.id",'Nodes.id','title', 'header', 'route', 'link',
'parent_id' => 'Nodes.parent_id' ])
->orderAsc('Nodes.num')
->cache("sitemenu_MenuItems", 'long')
->hydrate(false)
->toArray();
我在本地 OpenServer、IIS7 和 IIS8 服务器和其他 Linux 服务器上没有遇到此代码问题。
那么,发生了什么:
当我第一次运行脚本时,cake 从数据库中获取数据并将缓存写入/src/tmp/cache/long/cake_sitemenu__menu_items。文件像往常一样具有序列化内容。
但是当我刷新页面时,我看到空结果。
错误或调试日志中没有任何内容。
我尝试将缓存键小写,但没有成功。
有什么想法吗?
我添加了测试代码来检查基本缓存本身:
public function qwe(){
$data = ['key' => 'value'];
//Cache::write('test', $data, 'long');
$result = Cache::read('test', 'long');
$result[] = 'xxx';
$this->setJsonResponse($result);
}
并且此代码返回正确的结果。
到目前为止,我发现Cake\Cache\Egine\FileEngine 类的read() 方法存在一些问题。第 223 行:
$data = unserialize((string)$data);
$data 在调用主机和本地计算机之前具有相同的值。然后unserialize 返回带有空items 字段的ResultSet 对象;
SplFixedArray 和 unserialize 似乎有些东西
【问题讨论】:
-
与 IIS8.5 & PHP 7.1.12 相同
标签: php caching cakephp cakephp-3.0