ホームページ php教程 PHP开发 Laravel が memcached キャッシュを使用して記事の追加、削除、変更、クエリを最適化する方法

Laravel が memcached キャッシュを使用して記事の追加、削除、変更、クエリを最適化する方法

Dec 28, 2016 pm 04:34 PM

この記事の例では、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(&#39;还没有发布任何文章!&#39;);
      $html = &#39;<ul>&#39;;
      foreach ($posts as $post) {
        $html .= &#39;<li><a href=&#39;.route(&#39;post.show&#39;,[&#39;post&#39;=>$post]).&#39;>&#39;.$post->title.&#39;</li>&#39;;
      }
      $html .= &#39;</ul>&#39;;
      return $html;
    }
    /**
     * 创建新文章表单页面
     *
     * @return Response
     */
    public function create()
    {
      $postUrl = route(&#39;post.store&#39;);
      $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(&#39;title&#39;);
      $content = $request->input(&#39;content&#39;);
      $post = new Post;
      $post->title = $title;
      $post->content = $content;
      $post->save();
      return redirect()->route(&#39;post.show&#39;,[&#39;post&#39;=>$post]);
    }
    /**
     * 显示指定文章
     *
     * @param int $id
     * @return Response
     */
    public function show($id)
    {
      $post = Cache::get(&#39;post_&#39;.$id);
      if(!$post){
        $post = Post::find($id);
        if(!$post)
          exit(&#39;指定文章不存在!&#39;);
        Cache::put(&#39;post_&#39;.$id,$post,60*24*7);
      }
      if(!Cache::get(&#39;post_views_&#39;.$id))
        Cache::forever(&#39;post_views_&#39;.$id,0);
      $views = Cache::increment(&#39;post_views_&#39;.$id);
      Cache::forever(&#39;post_views_&#39;.$id,$views);
      $editUrl = route(&#39;post.edit&#39;,[&#39;post&#39;=>$post]);
      $deleteUrl = route(&#39;post.destroy&#39;,[&#39;post&#39;=>$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(&#39;指定文章不存在!&#39;);
      $postUrl = route(&#39;post.update&#39;,[&#39;post&#39;=>$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(&#39;指定文章不存在!&#39;);
      $title = $request->input(&#39;title&#39;);
      $content = $request->input(&#39;content&#39;);
      $post->title = $title;
      $post->content = $content;
      $post->save();
      return redirect()->route(&#39;post.show&#39;,[&#39;post&#39;=>$post]);
    }
    /**
     * 从存储器中移除指定文章
     *
     * @param int $id
     * @return Response
     */
    public function destroy($id)
    {
      $post = Post::find($id);
      if(!$post)
        exit(&#39;指定被删除文章不存在!&#39;);
      if($post->delete()){
        redirect()->route(&#39;post.index&#39;);
      }else{
        exit(&#39;删除文章失败!&#39;);
      }
    }
  }
ログイン後にコピー

なお、showメソッドでは、まずキャッシュから記事データを取得しますが、キャッシュに存在しない場合は、同時にデータベースからデータを取得します。データベース上のほとんどの操作は読み取り操作であるため、この小さな改善は、特に大量のデータを処理する場合にはパフォーマンスに大きな影響を与えません。さらに、パフォーマンスを向上させるためにキャッシュへのアクセスを継続します。

3. モデル イベントでキャッシュを使用する

記事が追加、削除、または変更されたときにモデル イベントを使用して、変更をキャッシュに保存する方法についても簡単に説明します。 AppServiceProviderのbootメソッド:

//保存之后更新缓存数据
Post::saved(function($post){
  $cacheKey = &#39;post_&#39;.$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 = &#39;post_&#39;.$post->id;
  $cacheData = Cache::get($cacheKey);
  if($cacheData){
    Cache::forget($cacheKey);
  }
  if(Cache::get(&#39;post_views_&#39;.$post->id))
    Cache::forget(&#39;post_views_&#39;.$post->id);
});
ログイン後にコピー

キャッシュの有効期間を1週間に設定しています。これにより、記事の作成・更新時にデータがキャッシュに保存され、記事の削除時にもキャッシュからデータが削除されるため、詳細表示時に削除された記事を参照することができなくなります。

この記事が、皆様のLaravelフレームワークをベースにしたPHPプログラム設計のお役に立てれば幸いです。

Laravel が memcached キャッシュを使用して記事の追加、削除、変更、検索を最適化する方法の詳細については、PHP 中国語 Web サイトの関連記事に注目してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)