【问题标题】:You cannot serialize or unserialize PDO instances CakePHP您不能序列化或反序列化 PDO 实例 CakePHP
【发布时间】:2017-09-10 20:27:47
【问题描述】:

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

error.log

错误:[PDOException] 您无法序列化或反序列化 PDO 实例 请求网址:/ 堆栈跟踪: #0 [内部函数]:PDO->__sleep() #1 供应商/cakephp/cakephp/src/Cache/Engine/FileEngine.php(148): 序列化(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 [内部函数]: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(蛋糕\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(蛋糕\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(蛋糕\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\响应)) #19 webroot/index.php(37): Cake\Http\Server->run() #20 {主要}

作曲家表演

$作曲家表演 光环/安装程序默认 1.0.0 光环/国际 1.1.1 cakephp/烘焙 1.2.8 cakephp/cakephp 3.3.7 cakephp/chronos 1.0.0 cakephp/debug_kit 3.3.7 cakephp/迁移 1.6.3 cakephp/插件安装程序 0.0.15 dnoegel/php-xdg-base-dir 0.1 jakub-onderka/php-console-color 0.1 jakub-onderka/php-console-highlighter v0.3.2 jdorn/sql-formatter v1.2.17 移动检测/移动检测库 2.8.22 用户代理字符串... nikic/php-parser v2.1.1 psr/http 消息 1.0.1 psr/日志 1.0.0 心理/心理 v0.7.2 罗摩根/芬克斯 v0.5.3 symfony/配置 v3.1.6 symfony/控制台 v3.1.6 symfony/调试 v3.1.6 symfony/文件系统 v3.1.6 symfony/polyfill-mbstring v1.2.0 symfony/var-dumper v3.1.6 symfony/yaml v3.1.6 zendframework/zend-diactoros 1.3.7

编辑

src/Controller/PostsController.php

if (($ViewsPosts = Cache::read('ViewsPosts')) === false) {

    $ViewsPosts = TableRegistry::get('ViewsPosts')->find('all')
        ->select([
            'count' => 'COUNT(*)',
            'Posts.created',
            'Posts.id',
        ])
        ->contain([
            'Posts'
        ])
        ->where([
            'Posts.status'        => 'published',
            'Posts.created >=' => new \DateTime('-7 days')
        ])
        ->group(['posts_id'])
        ->order(['count' => 'desc'])
        ->limit(5);

    Cache::write('ViewsPosts', $ViewsPosts); /// line 494
}

固定线路

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

【问题讨论】:

  • 实际代码是什么样子的?如果没有给出任何代码,很难给出反馈。什么时候出现错误?

标签: php cakephp caching pdo


【解决方案1】:

你的错误是由这个文件引起的:

src/Controller/PostsController.php494

您正在调用Cake\Cache\Cache::write('ViewsPosts', Object(Cake\ORM\Query)),但它不喜欢这样,因为您无法序列化 Cake\ORM\Query(这可能称为 $results 或其他名称,因此您不想这样做,而是想要这样做。

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

Caching Loaded Results - 下面也包含内容。

缓存加载的结果

在获取不经常更改的实体时,您可能希望缓存结果。 Query 类使这变得简单:

$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')));
});

缓存方法使将缓存结果添加到自定义查找器或通过事件侦听器变得简单。

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

  1. Model.beforeFind 事件被触发。
  2. 如果查询有结果集,将返回这些结果。
  3. 将解析缓存键并读取缓存数据。如果缓存数据不为空,则返回这些结果。
  4. 如果缓存未命中,将执行查询并创建新的 ResultSet。此 ResultSet 将被写入缓存并返回。

您不能缓存流式查询结果。

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 2019-06-25
    • 1970-01-01
    • 2011-05-27
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    相关资源
    最近更新 更多