最近因為之前的項目需要,需要對一個PHP項目進行優化,優化之余,突然想嘗試著用memcache去實現頁面靜態化的思想會不會有效果那?
頁面靜態話其實就是在訪問一個頁面的時候,由于這個頁面很少會發生變化,就可以考慮將這個頁面生成一個靜態的html保存起來,當再次訪問的時候直接訪問的是靜態的html,這樣的話會使網站的響應速度大幅度的提高,對整個網站的并發以及性能起到了優化作用。
動態生成html需要用到php的ob_start() 、ob_get_contents()函數,其實這個過程就是將解析后的html從瀏覽器的緩存中取出來保存成html文件。
那么我們用memcache去實現會是什么樣的那,首先我們取出一個頁面的唯一url地址(當然我們之前的寫法,每個函數只實現一個功能),經過md5作為唯一的key放入memcache緩存服務器中。當下一次訪問的時候如果有直接取memcache中的緩存,如果沒有進行正常解析,并將結果存入memcache服務器。
下面是具體的實現:
當一個已經成型的項目擺在你面前的時候,如何對這個項目進行優化處理,你拿到的程序有可能是加密的,也有可能項目文件非常大,我們如果一個一個的去看源碼,去修改往往是不太現實的,在這里我的思路時增加一個中間層,如此處,我們將項目入口文件改為index2.php,重新建一個入口文件(index.php)和一個memcache 的優化中間層(index1.php),用新的入口文件對index1.php 和 index2.php 做引入操作,加入緩存機制,對所有的訪問鏈接進行memcache緩存(采用頁面靜態化的思想),把頁面靜態化的思想去用memcache實現,是一種很不錯的方案,但是會有一個缺點,這里使用url 做md5作為唯一的key,假如存在一種情況,這個url有多個不同的頁面調用,此時會出現一些其他情況,需要注意,可以采取一個內置參數,讓某些url不再緩存,而這種方法對于ajax來說是作用不大的,(此處為我自己的理解)因為ajax獲取的是一個參數傳遞的過程,中間并沒有經過瀏覽器的緩存,所以我們得不到ajax的緩存。


index1.php 原來項目的入口文件
<? php
define("url','http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]);
class memcacheHtml{
public $memcache;
public $time=10;
public $urlArray = array();
function memcacheGet(){
$this->memcache = new memcache();
$this->memcache->connect('127.0.0.1',11211) or dir("error __FUNCTION__");
if($this->memcache->get(md5(url))){
echo $this->memcache->get(md5(url));
//$this->memcacheFlush();
return true;
}
return false;
}
function memecacheSet($data){
if(in_array(url,$this->urlArray)){
return true;
}
$this->memcache = new memcache();
$this->memcache->connect('127.0.0.1',11211) or dir("error __FUNCTION__");
$this->memcache->set(md5(url),$data,MEMCACHE_COMPRESSED,$this->time);
//echo $data;
}
function memcacheFlush(){
$this->memcache->flush();
}
}
index2.php
<?php
// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
$config = require(__DIR__ . '/../config/web.php');
(new yii/web/Application($config))->run();
index.php
<?php
include_once 'index1.php';
$requre = new memcacheHtml();
$requre->time = 1;
// if(strpos('login',url)){
// array_push($requre->urlArray,url);
// }
/*if(!empty($_GET['flush'])){
$requre->memcacheFlush();
}*/
if(!$requre->memcacheGet()){
ob_clean();
ob_start();
require_once 'index2.php';
$requre->memecacheSet(ob_get_contents());
}
?>其實memcache是一個簡單的內存服務器,平時的使用中多將數據查詢結果放入其中,當短時間內頻繁請求的時候可以快速響應,從而緩解是數據庫的壓力。這里這種方法只是一種想法的實現,相信會有更好的方法去提高響應速度,比如我們還可以通過Opcodes,緩存php的中間碼避免php的多次解析來提高站點的響應速度。但是自我感覺效果不太大,更大的效果是優化sql語句,表結構,以及緩存查詢結果等(僅僅是從自己優化的項目來說,只代表自己的觀點。)。
PHP編程 鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。