PHP 缓存请求
程序员文章站
2022-03-29 20:49:09
PHP 缓存请求。前提:
在公司遇到这样的问题:请求数据很慢,根据我了解是因为请求的数据关联很多的地方,服务器需要消耗相当资源来处理,于是我之前便思考出这个方案,现在终于有时...
PHP 缓存请求。前提:
在公司遇到这样的问题:请求数据很慢,根据我了解是因为请求的数据关联很多的地方,服务器需要消耗相当资源来处理,于是我之前便思考出这个方案,现在终于有时间来实现。
思路:
把请求的结果缓存到服务器上,再次进行相同的请求时,就会调取缓存,减轻服务器的压力,提高请求数据的速度。
完成:
UML:
代码:
requestAPI = ''; $this->requestAPI = $_SERVER["PHP_SELF"]; $this->requestAPI = str_replace('/', '', $this->requestAPI); $this->requestAPI = str_replace('.', '_', $this->requestAPI); $this->requestBody = ''; if ($_POST) { $this->requestBody = file_get_contents('php://input', 'r'); } else { $this->requestBody = $_SERVER["QUERY_STRING"]; } $this->requestBodyMD5 = ''; $this->requestBodyMD5 = md5($this->requestBody); $this->dirName = 'requestCache'; $this->isDirHere = FALSE; if (is_dir($this->dirName)) { //echo ' requestCache dir here!'; $this->isDirHere = TRUE; } else { //echo ' requestCache dir no here!'; if (mkdir($this->dirName)) { //echo ' requestCache create scuess!'; $this->isDirHere = TRUE; } else { //echo ' requestCache create fail!!'; $this->isDirHere = FALSE; } } } /*获取缓存*/ function getCache() { if ($this->isDirHere) { $cacheDir = $this->dirName.'/'.$this->requestAPI; $isCacheDirHere = FALSE; if (is_dir($cacheDir)) { $isCacheDirHere = TRUE; } if ($isCacheDirHere) { $path = $this->dirName.'/'.$this->requestAPI.'/'.$this->requestBodyMD5; $content = file_get_contents($path); return $content; } } } /*判断是否有缓存*/ function haveCache() { //echo ' $isDirHere-->'.$this->isDirHere; if ($this->isDirHere) { //echo ' $requestBodyMD5-->'.$this->requestBodyMD5; $path = $this->dirName.'/'.$this->requestAPI.'/'.$this->requestBodyMD5; //echo ' $path--->'.$path; if (file_exists($path)) { return TRUE; } } return FALSE; } /*清除缓存*/ function removeCache() { if ($this->isDirHere) { $cacheDir = $this->dirName.'/'.$this->requestAPI; return $this->deldir($cacheDir); } return FALSE; } /*清除指定的缓存*/ function removeCache1($requestAPI) { if ($this->isDirHere) { $cacheDir = $this->dirName.'/'.$requestAPI; return $this->deldir($cacheDir); } return FALSE; } /*创建缓存*/ function createCache($content) { if ($this->isDirHere) { $cacheDir = $this->dirName.'/'.$this->requestAPI; $isCacheDirHere = FALSE; if (is_dir($cacheDir)) { $isCacheDirHere = TRUE; } else { if (mkdir($cacheDir)) { $isCacheDirHere = TRUE; } else { $isCacheDirHere = FALSE; } } if ($isCacheDirHere) { $path = $this->dirName.'/'.$this->requestAPI.'/'.$this->requestBodyMD5; $fh = fopen($path, "a"); fwrite($fh, $content); fclose($fh); } } } function deldir($dir) { //先删除目录下的文件: $dh=opendir($dir); while ($file=readdir($dh)) { if($file!="." && $file!="..") { $fullpath=$dir."/".$file; if(!is_dir($fullpath)) { unlink($fullpath); } else { deldir($fullpath); } } } closedir($dh); //删除当前文件夹: if (rmdir($dir)) { return true; } else { return false; } } //选择数据库 //实现类的函数的重载 function __call($name, $args) { $isOK = false; if ($name == 'removeCache') { $isOK = true; } if ($isOK) { $i = count($args); if (method_exists($this, $f = $name . $i)) { call_user_func_array(array($this, $f), $args); } } } } ?>
后续:
写完给各位大大群友看完之后,提出很多宝贵意见:什么加锁、解锁、什么读写磁盘开销大.....
(希望以后我会懂的......)
虽然这些我都不懂,但是根据我觉得我这些处理的话,至少可以当公司减轻负担,因为公司的后台可不是像各位大大那么厉害。
再说,其实我不是PHPer,我只是一个略懂PHP语法的打杂,平时做的最多就是iOS,但是iOS 不好混啊,希望可以改混到Unity.....