ホームページ  >  記事  >  バックエンド開発  >  PHP+redis はフルページ キャッシュ システムを実装します

PHP+redis はフルページ キャッシュ システムを実装します

藏色散人
藏色散人転載
2020-09-11 13:31:435975ブラウズ

推奨: 「PHP ビデオ チュートリアル 」「redis チュートリアル#」 ##>>

php redis はフルページ キャッシュ システムを実装します

前のプロジェクトで説明した関数には、バックグラウンドに事前に保存されたページ情報が必要ですアプリの登録規約やユーザー規約などをデータベースに登録し、それをphpページに書き込むと、アプリがインターフェースを呼び出す際にこのページにアクセスすることになりますが、その際に問題を発見しました。これらの規約は頻繁に変更されます数か月に 1 回のみであり、ユーザーがこれらのプロトコルを表示するたびに、nginx はデータベースからファイルを再読み取りするため、速度が非常に遅くなります。

次の図 m_about.php はデータです。私が生成したページ、

PHP+redis はフルページ キャッシュ システムを実装します

データベースからロードして仮想マシン環境でファイルを再生成するのに 2.4 秒かかります (もちろん、実際のテスト環境はもっと速くなります)。

この種のページ データは更新されるので、キャッシュしないのはどうでしょうか? 以前に調べた一般的な Redis アプリケーションでフル ページ キャッシュ システム (フル ページ キャッシュ) を思いつきました。

コードのアイデア

Redis は phpredis 拡張機能を使用します。もちろん、predis 拡張機能も使用できます。いくつかの読み取り関数を変更するだけです。 .

キャッシュ システムのインターフェイスについては、laravel のキャッシュを参照しています。システム. このシステムのデザイン インターフェイスは非常に明確だと思います。redis だけでなく、ファイルも使用できます。 mysql, memcache.

もちろん、ページ全体のキャッシュはそれほど多くのものを使用しません。私は彼の関数設計を借用しただけです。最初の関数は getUrlText で、これはページ全体のデータを取得するためのものです。ここではあまり考えませんでした。file_get_contents を直接使用するだけです。もちろん、これをカール関数

/**
     * 获取对应的url的信息
     * @param string $url 对应的地址
     * @return boolean|string
     */
    public function getUrlText($url)
    {
        if (empty($url)) {
            return false;
        }
        return  file_get_contents($url);

    }

に書き直すこともできます。次に、キャッシュ システムから教訓を引き出す関数がいくつかあります。覚えておいてください。関数、メモリ キャッシュ、これは外部への最も重要なインターフェイスであり、通常はキャッシュ システムで直接使用します。

/**
   * 记录对应的缓存,如果之前存在则返回原本的缓存
   * @param string $cacheName 缓存名
   * @param string | callback $urlOrCallback 需要缓存的数据地址.可以是一个 网页地址也一个可回调类型,如果不是可回调类型,则判定是一个网址
   * @param null | int $ttl 缓存过期时间,如果不过期就是用默认值null
   * @throws \Exception 如果无法访问地址
   * @return boolean|string 缓存成功返回获取到的页面地址
   */
  public function remember($cacheName, $urlOrCallback, $ttl = null)
  {
      $value = $this->get($cacheName);//检查缓存是否存在
      if (!$value) {
          //之前没有使用键
          if (is_callable($urlOrCallback)) {
              $text = $urlOrCallback();
          } else {
              //如果不是回调类型,则尝试读取网址
              $text = $this->getUrlText($urlOrCallback);
          }

          if (empty($text)) {
              throw new \Exception('can not get value:' . $urlOrCallback);
          }
          $this->put($cacheName, $text, $ttl);
          return $text;
      } else {
          return $value;
      }

  }

refresh 関数、キャッシュのリフレッシュ関数、キャッシュ ページが更新されている場合は、[更新] に進みます。 .

/**
 * 更新缓存,并返回当前的缓存
 * @param string $cacheName 缓存名
 * @param string | callback $urlOrCallback 需要缓存的数据地址.可以是一个 网页地址也一个可回调类型,如果不是可回调类型,则判定是一个网址
 * @param null | int $ttl 过期时间,如果不过期就是用默认值null
 * @return boolean|string 缓存成功返回获取到的页面地址
 */
public function refresh($cacheName, $urlOrCallback, $ttl = null)
{
    $this->delete($cacheName);
    return $this->remember($cacheName, $urlOrCallback, $ttl);
}

残りの 2 つのコード ファイル。1 つはフル ページ キャッシュのデモである redisFPC.php、もう 1 つはテスト用のファイルです

fpcTest.php
使用方法は次のとおりです。 1 つは、私自身の Git ブログに接続されている github です。github への接続に問題がある場合は、この記事の最後にある完全なコードを参照してください。
#ここでテストです。対応する m_ahout 情報を読み取る必要があるため、最初のロードは遅くなります。

2 番目のロードは redlimian から読み取られるため、はるかに高速です。

PHP+redis はフルページ キャッシュ システムを実装します

使い方の提案


PHP+redis はフルページ キャッシュ システムを実装しますコードには十分なインターフェイスが用意されていると思います。初めてキャッシュするときは、remember 関数を使用してキャッシュを記録します。キャッシュが変更された場合は、更新関数を使用してキャッシュを更新します。可能であれば、ttl を使用してキャッシュの有効期限を設定してください。

完全なコード

redisFPC.php

<?php
namespace RedisFPC;
class RedisFPC
{
    /**
     * php redis的访问类
     * @var unknown
     */
    private $redis;

    /**
     * 构造函数
     * @param array $redis 使用phpredis的类
     * @param 是否连接成功
     */
    public function __construct($redis = [])
    {
    
        //$this->redis = $redis;
        $this->redis = new \Redis();
        return $this->redis->connect(&#39;127.0.0.1&#39;);
    }
    /**
     * 记录对应的缓存,如果之前存在则返回原本的缓存
     * @param string $cacheName 缓存名
     * @param string | callback $urlOrCallback 需要缓存的数据地址.可以是一个 网页地址也一个可回调类型,如果不是可回调类型,则判定是一个网址
     * @param null | int $ttl 缓存过期时间,如果不过期就是用默认值null
     * @throws \Exception 如果无法访问地址
     * @return boolean|string 缓存成功返回获取到的页面地址
     */
    public function remember($cacheName, $urlOrCallback, $ttl = null) 
    {
        $value = $this->get($cacheName);//检查缓存是否存在
        if (!$value) {
            //之前没有使用键
            if (is_callable($urlOrCallback)) {
                $text = $urlOrCallback();
            } else {
                //如果不是回调类型,则尝试读取网址
                $text = $this->getUrlText($urlOrCallback);
            }
            
            if (empty($text)) {
                throw new \Exception(&#39;can not get value:&#39; . $urlOrCallback);
            }
            $this->put($cacheName, $text, $ttl);
            return $text;
        } else {
            return $value;
        }
        
    }
    /**
     * 获取对应的缓存值
     * @param string $cacheName 缓存名
     * @return String | Bool,如果不存在返回false,否则返回对应的缓存页信息
     */
    public function get($cacheName)
    {
        return $this->redis->get($this->getKey($cacheName));
    }
    /**
     * 将对应的全页缓存保存到对应redis中
     * @param string $cacheName 缓存名
     * @param string $value
     * @param null | int $ttl 过期时间,如果不过期就是用默认值null
     * @return boolean 保存成功返回true
     */
    public function put($cacheName, $value, $ttl = null)    
    {
        if (is_null($ttl)) {
            return $this->redis->set($this->getKey($cacheName), $value);
        } else {
            return $this->redis->set($this->getKey($cacheName), $value, $ttl);
        }
        
    }
    /**
     * 删除对应缓存
     * @param string $cacheName 缓存名
     */
    public function delete($cacheName)
    {
        return $this->redis->delete($this->getKey($cacheName));
    }
    
    /**
     * 更新缓存,并返回当前的缓存
     * @param string $cacheName 缓存名
     * @param string | callback $urlOrCallback 需要缓存的数据地址.可以是一个 网页地址也一个可回调类型,如果不是可回调类型,则判定是一个网址
     * @param null | int $ttl 过期时间,如果不过期就是用默认值null
     * @return boolean|string 缓存成功返回获取到的页面地址
     */
    public function refresh($cacheName, $urlOrCallback, $ttl = null)
    {
        $this->delete($cacheName);
        return $this->remember($cacheName, $urlOrCallback, $ttl);
    }
    /**
     * 获取对应的url的信息
     * @param string $url 对应的地址
     * @return boolean|string
     */
    public function getUrlText($url)
    {
        if (empty($url)) {
            return false;
        } 
        return  file_get_contents($url);
        
    }
    /**
     * 生成全页缓存键名
     * @param string $cacheName 需要缓存的名称
     * @return string 对应的在redis中的键名
     */
    private function getKey($cacheName)
    {
        return &#39;FPC:&#39;. $cacheName;
    }
}

テスト用のテストコードここでの URL はローカル キャッシュ URL

<?php 
use RedisFPC\RedisFPC;

require_once &#39;redisFPC.php&#39;;
/* $text = file_get_contents(&#39;http://localhost:1002/m_about.php&#39;);
var_dump($text); */
$url = &#39;http://localhost:1002/m_about.php&#39;;

$fpc = new RedisFPC();
echo $fpc->remember(&#39;服务协议&#39;, $url, 60*60*24);

であることに注意してください_

以上がPHP+redis はフルページ キャッシュ システムを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。