不能序列化或取消序列化PDO实例CakePHP

不能序列化或取消序列化PDO实例CakePHP,php,cakephp,caching,pdo,Php,Cakephp,Caching,Pdo,我的cakephp出现问题,我不知道如何解决,我试图更新供应商,但错误仍然存在 错误。日志 Error: [PDOException] You cannot serialize or unserialize PDO instances Request URL: / Stack Trace: #0 [internal function]: PDO->__sleep() #1 vendor/cakephp/cakephp/src/Cache/Engine/FileEn

我的cakephp出现问题,我不知道如何解决,我试图更新供应商,但错误仍然存在

错误。日志

Error: [PDOException] You cannot serialize or unserialize PDO instances Request URL: / Stack Trace: #0 [internal function]: PDO->__sleep() #1 vendor/cakephp/cakephp/src/Cache/Engine/FileEngine.php(148): serialize(Object(Cake\ORM\Query)) #2 vendor/cakephp/cakephp/src/Cache/Cache.php(239): Cake\Cache\Engine\FileEngine->write('cake_views_post...', Object(Cake\ORM\Query)) #3 src/Controller/PostsController.php(494): Cake\Cache\Cache::write('ViewsPosts', Object(Cake\ORM\Query)) #4 src/Controller/PostsController.php(57): App\Controller\PostsController->getPostsSidebar() #5 vendor/cakephp/cakephp/src/Controller/Controller.php(262): App\Controller\PostsController->initialize() #6 [internal function]: Cake\Controller\Controller->__construct(Object(Cake\Network\Request), Object(Cake\Network\Response), 'Posts') #7 vendor/cakephp/cakephp/src/Http/ControllerFactory.php(79): ReflectionClass->newInstance(Object(Cake\Network\Request), Object(Cake\Network\Response), 'Posts') #8 vendor/cakephp/cakephp/src/Http/ActionDispatcher.php(93): Cake\Http\ControllerFactory->create(Object(Cake\Network\Request), Object(Cake\Network\Response)) #9 vendor/cakephp/cakephp/src/Http/BaseApplication.php(83): Cake\Http\ActionDispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response)) #10 vendor/cakephp/cakephp/src/Http/Runner.php(65): Cake\Http\BaseApplication->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response), Object(Cake\Http\Runner)) #11 vendor/cakephp/cakephp/src/Routing/Middleware/RoutingMiddleware.php(62): Cake\Http\Runner->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response)) #12 vendor/cakephp/cakephp/src/Http/Runner.php(65): Cake\Routing\Middleware\RoutingMiddleware->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response), Object(Cake\Http\Runner)) #13 vendor/cakephp/cakephp/src/Routing/Middleware/AssetMiddleware.php(88): Cake\Http\Runner->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response)) #14 vendor/cakephp/cakephp/src/Http/Runner.php(65): Cake\Routing\Middleware\AssetMiddleware->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response), Object(Cake\Http\Runner)) #15 vendor/cakephp/cakephp/src/Error/Middleware/ErrorHandlerMiddleware.php(81): Cake\Http\Runner->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response)) #16 vendor/cakephp/cakephp/src/Http/Runner.php(65): Cake\Error\Middleware\ErrorHandlerMiddleware->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response), Object(Cake\Http\Runner)) #17 vendor/cakephp/cakephp/src/Http/Runner.php(51): Cake\Http\Runner->__invoke(Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response)) #18 vendor/cakephp/cakephp/src/Http/Server.php(92): Cake\Http\Runner->run(Object(Cake\Http\MiddlewareQueue), Object(Zend\Diactoros\ServerRequest), Object(Zend\Diactoros\Response)) #19 webroot/index.php(37): Cake\Http\Server->run() #20 {main} 固定线路

- Cache::write('ViewsPosts', $ViewsPosts);
+ Cache::write('ViewsPosts', $ViewsPosts->toArray());

您的错误是由以下文件引起的:

src/Controller/PostsController.php
第494行

您正在调用
Cake\Cache\Cache::write('ViewsPosts',Object(Cake\ORM\Query))
,但它不喜欢这样做,因为您无法序列化Cake\ORM\Query(这可能被称为
$results
或其他什么,所以您不想这样做

$results->cache('viewsposts');
它将为您缓存结果。您可以从CakePHP网站获得更多信息

-也包括以下内容

缓存加载的结果

获取不经常更改的实体时,您可能希望缓存结果。查询类使此操作变得简单:

$query->cache('recent_articles');
将对查询的结果集启用缓存。如果仅为cache()提供了一个参数,则将使用“默认”缓存配置。您可以控制与第二个参数一起使用的缓存配置:

// String config name.
$query->cache('recent_articles', 'dbResults');

// Instance of CacheEngine
$query->cache('recent_articles', $memcache);
除了支持静态键外,cache()方法还接受一个生成键的函数。您给它的函数将接收作为参数的查询。然后,您可以读取查询的各个方面以动态生成缓存键:

// Generate a key based on a simple checksum
// of the query's where clause
$query->cache(function ($q) {
    return 'articles-' . md5(serialize($q->clause('where')));
});
cache方法使将缓存结果添加到自定义查找程序或通过事件侦听器变得简单

获取缓存查询的结果时,会发生以下情况:

  • 将触发Model.beforeFind事件
  • 如果查询已设置结果,则将返回这些结果
  • 将解析缓存密钥并读取缓存数据。如果缓存数据不为空,则将返回这些结果
  • 如果缓存未命中,将执行查询并创建新的结果集。此结果集将写入缓存并返回
  • 无法缓存流式查询结果


    实际的代码是什么样子的?如果没有给出任何代码,很难给出反馈。错误何时发生?
    // String config name.
    $query->cache('recent_articles', 'dbResults');
    
    // Instance of CacheEngine
    $query->cache('recent_articles', $memcache);
    
    // Generate a key based on a simple checksum
    // of the query's where clause
    $query->cache(function ($q) {
        return 'articles-' . md5(serialize($q->clause('where')));
    });