2017-02-04 5 views
7

を読み取ることができない:Laravelは時折私はこのようなコードを使用して、ウェブサイト上でlaravelキャッシング(<code>remember()</code>法)を使用していたキャッシュ

$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) 

この問題を解決するためにどのように?

私は、キャッシュをクリアすると問題が解決することがわかっています。だから、問題はファイルのいくつかの破損であるようです。私は "ファイルが読めない"と気付くだけでキャッシュをクリアすれば(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

私はlaravel 4.2でこれまで同様の問題が発生していましたが、何らかの理由でその時点でキャッシュのファイルが削除されていましたが、キャッシュクラスはキャッシュを取得しようとします。存在する)、キャッシュをクリーニングした後は、すべて正常に動作します。私が言いたいのは、Cache :: putを使用しても、何も変更されないことを覚えていなくても、これが来る唯一の方法は、これが起こることがわかっているときにキャッシュを無効にすることです。 –

+0

Haveあなたはディスククォータか、おそらくスペースを使い果たしていますか?または、文字列に予期しない文字がありますか。 imhoの前に進む最も良い方法は、FileStore.phpの78行目の内容をVarDumpすることです。あなたが見つけたものを教えてください。 – DonCallisto

+0

@DonCallistoスペースに問題はありませんが、私はそれを使い果たしていません。しかし、ファイルは何らかの理由で削除されるようです。私は例外をキャッチし、それをログファイルに書きました。それはときどき起こるだけでリソースの制限に達していないように見えるので奇妙です。 –

答えて

0

laravelはキャッシュファイルをオーバーライドしています(破損しています)。ファイルの最後にどのようなコンテンツがあるかを調べる必要があります。

また、キャッシュに入れるコンテンツの種類を確認する必要があります。laravelは、バグの可能性があるファイルストレージプラグインを使用します。

これをデバッグするには、ここをクリックしてください。 https://stackoverflow.com/a/10152996/3305978

1

IMHOはファイルドライバに問題がある可能性があります。私は、あなたが良い要求を処理することができる良いWebサーバーを持っている場合、問題は、ファイルドライバが並行処理を処理できないということです。

これは、通常、ファイルシステム自体が、同じファイルへの異なる並行プロセスの読み込み/書き込み処理にはあまり適していないという事実に関連しています。

最後に、ドライバを並行処理、つまりMemcachedまたはRedisなどの処理能力があるものに切り替えることをお勧めしますが、データベースも十分に機能するはずです。

セッションhereの同じ提案を見つけて、2番目の記事を見てください。キャッシュファイルドライバにも関係すると思います。

+0

これは私が置くことができる解決策ではありませんが、正しい問題を指摘していると思います。私はここに誰もいないので、それは十分だと思う:) –

+0

本当にありがとう@Džurisはこの答えが役立つことを願って – dparoli

関連する問題