当前位置:首页 > PHP教程 > php高级应用 > 列表

Laravel memcached缓存对文章增删改查进行优化例子

发布:smiling 来源: PHP粉丝网  添加日期:2018-10-30 10:28:30 浏览: 评论:0 

本节我们将以文章的增删改查作为实例系统讲述缓存的使用,这个实例是对之前创建RESTFul风格控制器实现文章增删改查这篇教程的改造和升级,我们将在其基础上融合进Eloquent ORM和模型事件,将应用的场景直接拉到生成环境。

1、准备工作

路由及控制器

路由的定义和控制器的创建保持和创建RESTFul风格控制器实现文章增删改查中一样。

创建数据表

关于文章对应数据表我们在数据库部分使用查询构建器实现对数据库的高级查询已有提及,这里我们使用之前创建的数据表即可。

创建文章模型

关于文章模型Post的创建也和之前Eloquent ORM部分讲ORM概述、模型定义及基本查询中创建的一致。

2、修改控制器

在之前我们是通过缓存实现对文章的增删改查操作,这里我们将其修改为通过数据库实现增删改查操作:

  1.     namespace App\Http\Controllers; 
  2.  
  3.     use Illuminate\Http\Request; 
  4.  
  5.     use Cache; 
  6.     use App\Models\Post; 
  7.  
  8.     use App\Http\Requests; 
  9.     use App\Http\Controllers\Controller; 
  10.  
  11.     class PostController extends Controller 
  12.     { 
  13.         /** 
  14.          * 显示文章列表. 
  15.          * 
  16.          * @return Response 
  17.          */ 
  18.         public function index() 
  19.         { 
  20.             //使用all获取所有数据,如果数据量大采用分页获取 
  21.             $posts = Post::all(); 
  22.             if(!$posts
  23.                 exit('还没有发布任何文章!'); 
  24.  
  25.             $html = '<ul>'
  26.  
  27.             foreach ($posts as $post) { 
  28.                 $html .= '<li><a href='.route('post.show',['post'=>$post]).'>'.$post->title.'</li>'
  29.             } 
  30.  
  31.             $html .= '</ul>'
  32.  
  33.             return $html
  34.         } 
  35.  
  36.         /** 
  37.          * 创建新文章表单页面 
  38.          * 
  39.          * @return Response 
  40.          */ 
  41.         public function create() 
  42.         { 
  43.             $postUrl = route('post.store'); 
  44.             $csrf_field = csrf_field(); 
  45.             $html = <<<CREATE 
  46.                 <form action="$postUrl" method="POST"
  47.                     $csrf_field 
  48.                     <input type="text" name="title"><br/><br/> 
  49.                     <textarea name="content" cols="50" rows="5"></textarea><br/><br/> 
  50.                     <input type="submit" value="提交"/> 
  51.                 </form> 
  52. CREATE; 
  53.             return $html
  54.  
  55.         /** 
  56.          * 将新创建的文章存储到存储器 
  57.          * 
  58.          * @param Request $request 
  59.          * @return Response 
  60.          */ 
  61.         public function store(Request $request
  62.         { 
  63.             $title = $request->input('title'); 
  64.             $content = $request->input('content'); 
  65.  
  66.             $post = new Post; 
  67.             $post->title = $title
  68.             $post->content = $content
  69.             $post->save(); 
  70.  
  71.             return redirect()->route('post.show',['post'=>$post]); 
  72.         } 
  73.  
  74.         /** 
  75.          * 显示指定文章 
  76.          * 
  77.          * @param int $id 
  78.          * @return Response 
  79.          */ 
  80.         public function show($id
  81.         { 
  82.  
  83.             $post = Cache::get('post_'.$id); 
  84.             if(!$post){ 
  85.                 $post = Post::find($id); 
  86.                 if(!$post
  87.                     exit('指定文章不存在!'); 
  88.                 Cache::put('post_'.$id,$post,60*24*7); 
  89.             } 
  90.  
  91.             if(!Cache::get('post_views_'.$id)) 
  92.                 Cache::forever('post_views_'.$id,0); 
  93.             $views = Cache::increment('post_views_'.$id); 
  94.             Cache::forever('post_views_'.$id,$views); 
  95.  
  96.             $editUrl = route('post.edit',['post'=>$post]); 
  97.             $deleteUrl = route('post.destroy',['post'=>$post]); 
  98.             $html = <<<POST 
  99.                 <h3>{$post->title}</h3> 
  100.                 <p>{$post->content}</p> 
  101.                 <i>已有{$views}人阅读</i> 
  102.                 <p> 
  103.                     <a href="{$editUrl}">编辑</a> 
  104.                 </p> 
  105. POST; 
  106.  
  107.             return $html
  108.         } 
  109.  
  110.         /** 
  111.          * 显示编辑指定文章的表单页面 
  112.          * 
  113.          * @param int $id 
  114.          * @return Response 
  115.          */ 
  116.         public function edit($id
  117.         { 
  118.             $post = Post::find($id); 
  119.  
  120.             if(!$post
  121.                 exit('指定文章不存在!'); 
  122.  
  123.             $postUrl = route('post.update',['post'=>$post]); 
  124.             $csrf_field = csrf_field(); 
  125.             $html = <<<CREATE 
  126.                 <form action="$postUrl" method="POST"
  127.                     $csrf_field 
  128.                     <input type="hidden" name="_method" value="PUT"/> 
  129.                     <input type="text" name="title" value="{$post->title}"><br/><br/> 
  130.                     <textarea name="content" cols="50" rows="5">{$post->content}</textarea><br/><br/> 
  131.                     <input type="submit" value="提交"/> 
  132.                 </form> 
  133. CREATE; 
  134.             return $html
  135.  
  136.         } 
  137.  
  138.         /** 
  139.          * 在存储器中更新指定文章 
  140.          * 
  141.          * @param Request $request 
  142.          * @param int $id 
  143.          * @return Response 
  144.          */ 
  145.         public function update(Request $request$id
  146.         { 
  147.             $post = Post::find($id); 
  148.             if(!$post
  149.                 exit('指定文章不存在!'); 
  150.  
  151.             $title = $request->input('title'); 
  152.             $content = $request->input('content'); 
  153.  
  154.             $post->title = $title
  155.             $post->content = $content
  156.  
  157.             $post->save(); 
  158.  
  159.             return redirect()->route('post.show',['post'=>$post]); 
  160.         } 
  161.  
  162.         /** 
  163.          * 从存储器中移除指定文章 
  164.          * 
  165.          * @param int $id 
  166.          * @return Response 
  167.          */ 
  168.         public function destroy($id
  169.         { 
  170.             $post = Post::find($id); 
  171.             if(!$post
  172.                 exit('指定被删除文章不存在!'); 
  173. //phpfensi.com 
  174.             if($post->delete()){ 
  175.                 redirect()->route('post.index'); 
  176.             }else
  177.                 exit('删除文章失败!'); 
  178.             } 
  179.         } 
  180.     } 

需要注意的是在show方法中,我们首先从缓存中取文章数据,缓存中不存在才会去数据库取,同时将数据回写到缓存中,由于对数据库的操作大部分都是读操作,所以这一点小小的改进对性能却有很大提升,尤其是在海量数据时。此外我们还将访问量持久化到缓存中以提升性能。

3、在模型事件中使用缓存

我们还可以通过模型事件在文章进行增删改的时候触发相应事件将修改保存到缓存中,这里我们简单讲模型事件注册到AppServiceProvider的boot方法中:

  1. //保存之后更新缓存数据 
  2. Post::saved(function($post){ 
  3.     $cacheKey = 'post_'.$post->id; 
  4.     $cacheData = Cache::get($cacheKey); 
  5.     if(!$cacheData){ 
  6.         Cache::add($cacheKey,$post,60*24*7); 
  7.     }else
  8.         Cache::put($cacheKey,$post,60*24*7); 
  9.     } 
  10. }); 
  11.  
  12. //删除之后清除缓存数据 
  13. Post::deleted(function($post){ 
  14.     $cacheKey = 'post_'.$post->id; 
  15.     $cacheData = Cache::get($cacheKey); 
  16.     if($cacheData){ 
  17.         Cache::forget($cacheKey); 
  18.     } 
  19.     if(Cache::get('post_views_'.$post->id)) 
  20.         Cache::forget('post_views_'.$post->id); 
  21. }); 

我们将缓存有效期设置为一周。这样在文章创建或更新时会将数据保存到缓存,而删除文章时也会从缓存中移除数据,从而保证被删除后的文章查看详情时也不能浏览。

Tags: Laravel memcached

分享到: