この記事の例では、Laravel が memcached キャッシュを使用して記事の追加、削除、変更、クエリを最適化する方法を説明します。参考として皆さんと共有してください。詳細は次のとおりです。
ここでは、キャッシュの使用方法を説明するためのシステム例として、記事の追加、削除、変更、チェックを使用します。この例は、前のチュートリアルを修正したものです。記事の追加、削除、変更、チェックを実装するための RESTFul スタイル コントローラーの作成について説明します。アップグレードでは、Eloquent ORM とそれに基づくモデル イベントを統合し、アプリケーション シナリオを運用環境に直接取り込みます。
1. 準備
ルーティングとコントローラー
ルーティングの定義とコントローラーの作成は、記事の追加、削除、変更、チェックを実装するための RESTFul スタイルのコントローラーの作成と同じです。
データテーブルを作成する
この記事に対応するデータテーブルについては、データベース部分でクエリビルダーを使用してデータベースに高度なクエリを実装することをすでに述べました。ここでは、前に作成したデータテーブルを使用できます。
記事モデルの作成
記事モデル Post の作成は、ORM の概要、モデル定義、基本的なクエリに関する前の Eloquent ORM セクションの作成と一致しています。
2. コントローラーを変更します
これまでは、キャッシュを介して記事の追加、削除、変更、クエリ操作を実装していましたが、ここでは、データベースを介して追加、削除、変更、クエリ操作を実装するように変更します。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Cache; use App\Models\Post; use App\Http\Requests; use App\Http\Controllers\Controller; class PostController extends Controller { /** * 显示文章列表. * * @return Response */ public function index() { //使用all获取所有数据,如果数据量大采用分页获取 $posts = Post::all(); if(!$posts) exit('还没有发布任何文章!'); $html = '<ul>'; foreach ($posts as $post) { $html .= '<li><a href='.route('post.show',['post'=>$post]).'>'.$post->title.'</li>'; } $html .= '</ul>'; return $html; } /** * 创建新文章表单页面 * * @return Response */ public function create() { $postUrl = route('post.store'); $csrf_field = csrf_field(); $html = <<<CREATE <form action="$postUrl" method="POST"> $csrf_field <input type="text" name="title"><br/><br/> <textarea name="content" cols="50" rows="5"></textarea><br/><br/> <input type="submit" value="提交"/> </form> CREATE; return $html; } /** * 将新创建的文章存储到存储器 * * @param Request $request * @return Response */ public function store(Request $request) { $title = $request->input('title'); $content = $request->input('content'); $post = new Post; $post->title = $title; $post->content = $content; $post->save(); return redirect()->route('post.show',['post'=>$post]); } /** * 显示指定文章 * * @param int $id * @return Response */ public function show($id) { $post = Cache::get('post_'.$id); if(!$post){ $post = Post::find($id); if(!$post) exit('指定文章不存在!'); Cache::put('post_'.$id,$post,60*24*7); } if(!Cache::get('post_views_'.$id)) Cache::forever('post_views_'.$id,0); $views = Cache::increment('post_views_'.$id); Cache::forever('post_views_'.$id,$views); $editUrl = route('post.edit',['post'=>$post]); $deleteUrl = route('post.destroy',['post'=>$post]); $html = <<<POST <h3>{$post->title}</h3> <p>{$post->content}</p> <i>已有{$views}人阅读</i> <p> <a href="{$editUrl}">编辑</a> </p> POST; return $html; } /** * 显示编辑指定文章的表单页面 * * @param int $id * @return Response */ public function edit($id) { $post = Post::find($id); if(!$post) exit('指定文章不存在!'); $postUrl = route('post.update',['post'=>$post]); $csrf_field = csrf_field(); $html = <<<CREATE <form action="$postUrl" method="POST"> $csrf_field <input type="hidden" name="_method" value="PUT"/> <input type="text" name="title" value="{$post->title}"><br/><br/> <textarea name="content" cols="50" rows="5">{$post->content}</textarea><br/><br/> <input type="submit" value="提交"/> </form> CREATE; return $html; } /** * 在存储器中更新指定文章 * * @param Request $request * @param int $id * @return Response */ public function update(Request $request, $id) { $post = Post::find($id); if(!$post) exit('指定文章不存在!'); $title = $request->input('title'); $content = $request->input('content'); $post->title = $title; $post->content = $content; $post->save(); return redirect()->route('post.show',['post'=>$post]); } /** * 从存储器中移除指定文章 * * @param int $id * @return Response */ public function destroy($id) { $post = Post::find($id); if(!$post) exit('指定被删除文章不存在!'); if($post->delete()){ redirect()->route('post.index'); }else{ exit('删除文章失败!'); } } }なお、showメソッドでは、まずキャッシュから記事データを取得しますが、キャッシュに存在しない場合は、同時にデータベースからデータを取得します。データベース上のほとんどの操作は読み取り操作であるため、この小さな改善は、特に大量のデータを処理する場合にはパフォーマンスに大きな影響を与えません。さらに、パフォーマンスを向上させるためにキャッシュへのアクセスを継続します。 3. モデル イベントでキャッシュを使用する記事が追加、削除、または変更されたときにモデル イベントを使用して、変更をキャッシュに保存する方法についても簡単に説明します。 AppServiceProviderのbootメソッド:
//保存之后更新缓存数据 Post::saved(function($post){ $cacheKey = 'post_'.$post->id; $cacheData = Cache::get($cacheKey); if(!$cacheData){ Cache::add($cacheKey,$post,60*24*7); }else{ Cache::put($cacheKey,$post,60*24*7); } }); //删除之后清除缓存数据 Post::deleted(function($post){ $cacheKey = 'post_'.$post->id; $cacheData = Cache::get($cacheKey); if($cacheData){ Cache::forget($cacheKey); } if(Cache::get('post_views_'.$post->id)) Cache::forget('post_views_'.$post->id); });キャッシュの有効期間を1週間に設定しています。これにより、記事の作成・更新時にデータがキャッシュに保存され、記事の削除時にもキャッシュからデータが削除されるため、詳細表示時に削除された記事を参照することができなくなります。 この記事が、皆様のLaravelフレームワークをベースにしたPHPプログラム設計のお役に立てれば幸いです。 Laravel が memcached キャッシュを使用して記事の追加、削除、変更、検索を最適化する方法の詳細については、PHP 中国語 Web サイトの関連記事に注目してください。