추천: "PHP Video Tutorial" "redis Tutorial"
php redis는 전체 페이지 캐싱 시스템을 구현합니다
이전 프로젝트에서 언급한 기능은 다음과 같아야 합니다. 백그라운드는 앱의 등록 계약, 사용자 계약 등과 같은 특정 페이지 정보를 데이터베이스에 미리 저장합니다. 그런 다음 이를 PHP 페이지에 기록하고 앱이 인터페이스를 호출할 때 이 페이지에 액세스합니다. 문제를 발견하면 이러한 계약은 몇 달에 한 번씩 수정되는 경우가 많으며 사용자가 이러한 프로토콜을 볼 때마다 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; } }
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); }
남은 두 개의 코드 파일입니다. 하나는 전체 페이지 캐싱 데모인 redisFPC.php이고, 다른 하나는 테스트 파일입니다.
fpcTest.php
이것은 my에 연결된 github을 사용하고 있습니다. 자신의 git 블로그에 연결하는 데 문제가 있는 경우 이 기사 끝부분에서 전체 코드를 볼 수 있습니다.
Testing
여기에서 테스트하고, 처음으로 로드합니다. 해당 내용을 읽어보세요. m_ahout 정보이므로 조금 느려집니다
redislimian에서 읽기 때문에 훨씬 빠릅니다
사용 제안
코드 인터페이스를 충분히 제공한 것 같습니다. 기억 기능을 사용하여 처음 캐싱할 때 캐시를 기록하고, 캐시가 변경되면 새로 고침 기능을 사용하여 캐시를 업데이트하세요. 가능하다면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!