Laravel偶尔会无法读取缓存

时间:2017-02-04 20:45:11

标签: php caching laravel-5 laravel-5.1

我在网站上使用laravel缓存(remember()方法),代码如下:

$postedItems = Cache::remember('home_posted_items', $this->cacheTimes['postedItems'], function() {

    /* the stuff that prepares data */

    return ['items' => $items, 'firstItemNumber' => $firstItem];
});

问题是,有时(每隔几天,我说)缓存文件似乎已损坏,因此我有停机时间,直到缓存过期(除非我手动清除)。

以下是可能相关的错误堆栈的一部分:

[2017-02-04 22:01:34] production.ERROR: ErrorException: unserialize(): Error at offset 131059 of 131062 bytes in /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php:78
Stack trace:
#0 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'unserialize(): ...', '/home/path/to/...', 78, Array)
#1 /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php(78): unserialize('a:2:{s:7:"item...')
#2 /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php(47): Illuminate\Cache\FileStore->getPayload('home_posted_ite...')
#3 /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(98): Illuminate\Cache\FileStore->get('home_posted_ite...')
#4 /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(202): Illuminate\Cache\Repository->get('home_posted_ite...')
#5 [internal function]: Illuminate\Cache\Repository->remember('home_posted_ite...', 1, Object(Closure))
#6 /home/path/to/app/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php(318): call_user_func_array(Array, Array)
#7 /home/path/to/app/bootstrap/cache/compiled.php(6089): Illuminate\Cache\CacheManager->__call('remember', Array)
#8 /home/path/to/app/app/Http/Controllers/HomeController.php(197): Illuminate\Support\Facades\Facade::__callStatic('remember', Array)

如何解决这个问题?

根据经验,我知道清除缓存可以解决问题。所以似乎问题是文件中的一些损坏。我想如果我能注意到#34;文件是不可读的"并且只需清除缓存(Cache::forget(...)),就可以解决问题。

注意到此类错误的最佳方法是什么?似乎检索文件的所有逻辑都隐藏在remember()方法中。我应该打开它并使用其他方法,如下所示吗?

if (!($postedItems = @Cache::get('home_posted_items'))
{
    // prepare data

    $postedItems = ['items' => $items, 'firstItemNumber' => $firstItem];

    Cache::put('home_posted_items', $postedItems, $this->cacheTimes['postedItems']);
}

2 个答案:

答案 0 :(得分:1)

恕我直言可能是文件驱动程序的问题。我认为,如果你有一个能够处理并发请求的好的Web服务器,问题是文件驱动程序不能处理并发。

这与通常文件系统本身不太适合处理读取/写入同一文件的不同并发进程这一事实有关。

最后,我建议你将驱动程序切换到更有能力处理并发性的东西,即Memcached或Redis,但数据库也应该足够好。

您可以为会话here找到相同的建议,请查看第二篇文章,我认为这也可能与缓存文件驱动程序相关。

答案 1 :(得分:0)

它似乎不是权限问题(您可以在堆栈跟踪中看到#1),不知何故laravel会覆盖(损坏)缓存文件。您需要找到文件末尾的内容。

您还需要检查要缓存的内容类型,laravel使用可能存在错误的文件存储插件。

最好的调试方法就在这里。 https://stackoverflow.com/a/10152996/3305978