我在网站上使用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']);
}
答案 0 :(得分:1)
恕我直言可能是文件驱动程序的问题。我认为,如果你有一个能够处理并发请求的好的Web服务器,问题是文件驱动程序不能处理并发。
这与通常文件系统本身不太适合处理读取/写入同一文件的不同并发进程这一事实有关。
最后,我建议你将驱动程序切换到更有能力处理并发性的东西,即Memcached或Redis,但数据库也应该足够好。
您可以为会话here找到相同的建议,请查看第二篇文章,我认为这也可能与缓存文件驱动程序相关。
答案 1 :(得分:0)
它似乎不是权限问题(您可以在堆栈跟踪中看到#1),不知何故laravel会覆盖(损坏)缓存文件。您需要找到文件末尾的内容。
您还需要检查要缓存的内容类型,laravel使用可能存在错误的文件存储插件。
最好的调试方法就在这里。 https://stackoverflow.com/a/10152996/3305978