推奨: 「PHP ビデオ チュートリアル 」「redis チュートリアル#」 ##>>
php redis はフルページ キャッシュ システムを実装します
前のプロジェクトで説明した関数には、バックグラウンドに事前に保存されたページ情報が必要ですアプリの登録規約やユーザー規約などをデータベースに登録し、それをphpページに書き込むと、アプリがインターフェースを呼び出す際にこのページにアクセスすることになりますが、その際に問題を発見しました。これらの規約は頻繁に変更されます数か月に 1 回のみであり、ユーザーがこれらのプロトコルを表示するたびに、nginx はデータベースからファイルを再読み取りするため、速度が非常に遅くなります。次の図 m_about.php はデータです。私が生成したページ、 データベースからロードして仮想マシン環境でファイルを再生成するのに 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; } }
/** * 更新缓存,并返回当前的缓存 * @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); }
fpcTest.php
使用方法は次のとおりです。 1 つは、私自身の Git ブログに接続されている github です。github への接続に問題がある場合は、この記事の最後にある完全なコードを参照してください。
#ここでテストです。対応する m_ahout 情報を読み取る必要があるため、最初のロードは遅くなります。
2 番目のロードは redlimian から読み取られるため、はるかに高速です。 使い方の提案
コードには十分なインターフェイスが用意されていると思います。初めてキャッシュするときは、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('127.0.0.1'); } /** * 记录对应的缓存,如果之前存在则返回原本的缓存 * @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; } } /** * 获取对应的缓存值 * @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 'FPC:'. $cacheName; } }
テスト用のテストコードここでの URL はローカル キャッシュ URL
<?php use RedisFPC\RedisFPC; require_once 'redisFPC.php'; /* $text = file_get_contents('http://localhost:1002/m_about.php'); var_dump($text); */ $url = 'http://localhost:1002/m_about.php'; $fpc = new RedisFPC(); echo $fpc->remember('服务协议', $url, 60*60*24);
以上がPHP+redis はフルページ キャッシュ システムを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。