ホームページ >php教程 >php手册 >PHP キャッシュの原理と使用法

PHP キャッシュの原理と使用法

WBOY
WBOYオリジナル
2016-06-21 08:52:41936ブラウズ

PHP は、そのパワーとスケーラビリティにより、近年大きな進歩を遂げています。従来の ASP ウェブサイトと比較すると、PHP は速度の面で絶対的な優位性を持っています。60,000 個のデータを mssql に転送する場合、PHP は 40 秒かかります。 ASP には 2 分もかかりませんが、Web サイトのデータが増えるにつれて、そのデータを毎回データベースから削除する必要がなくなります。ファイルまたは特定のメモリアドレスとして。これは、PHP のキャッシュ技術、つまりキャッシュ技術です。

徹底した分析
一般的に、キャッシュの目的は、アクセスを高速化するためにデータを 1 か所に置くことです。メモリが最も高速であることは間違いありませんが、数百 M のデータをメモリに保存できるでしょうか? もちろん、これは非現実的な場合もあります。たとえば、ob_start() キャッシュ ページがオンになっている場合、ページのコンテンツは、ページ出力が自動的にクリアされるまで、または返されるまで、ファイル ヘッダーを送信する前にメモリにキャッシュされます。これは、静的ページの生成にうまく利用でき、テンプレートにうまく反映できます。
さらに、ASP にはパブリック パラメータを保存できるオブジェクト アプリケーションがあり、これもキャッシュとみなされますが、開発者がそのようなオブジェクトを作成するのはこれまで見たことがありません。実際、それは必要ありません。キャッシュ技術 ビューステートを使用しており、キャッシュはファイルの関連付けです (必ずしも正確であるとは限りません)。ファイルが変更されずにタイムアウトしない場合 (注 1)、キャッシュが読み取られます。これがアイデアです。このソースコードを見てください:

<ol class="dp-c">
<li class="alt"><span><span><?PHP    </span></span></li><li><span>    <span class="keyword">class</span><span> cache{     </span></span></li><li class="alt"><span>    <span class="keyword">private</span><span> </span><span class="vars">$cache_dir</span><span>;     </span></span></li><li><span>    <span class="keyword">private</span><span> </span><span class="vars">$expireTime</span><span>=180;</span><span class="comment">//缓存的时间是 60 秒    </span><span> </span></span></li><li class="alt"><span>    <span class="keyword">function</span><span> __construct(</span><span class="vars">$cache_dirname</span><span>){     </span></span></li><li><span>     <span class="keyword">if</span><span>(!@</span><span class="func">is_dir</span><span>(</span><span class="vars">$cache_dirname</span><span>)){     </span></span></li><li class="alt"><span>      <span class="keyword">if</span><span>(!@</span><span class="func">mkdir</span><span>(</span><span class="vars">$cache_dirname</span><span>,0777)){     </span></span></li><li><span>      <span class="vars">$this</span><span>->warn(</span><span class="string">'缓存文件不存在而且不能创建,需要手动创建.'</span><span>);     </span></span></li>
<li class="alt"><span>      <span class="keyword">return</span><span> false;     </span></span></li>
<li><span>      }     </span></li>
<li class="alt"><span>     }     </span></li>
<li><span>    <span class="vars">$this</span><span>->cache_dir = </span><span class="vars">$cache_dirname</span><span>;     </span></span></li>
<li class="alt"><span>    }     </span></li>
<li><span>    <span class="keyword">function</span><span> __destruct(){     </span></span></li>
<li class="alt"><span>     <span class="func">echo</span><span> </span><span class="string">'Cache class bye.'</span><span>;     </span></span></li>
<li><span>    }     </span></li>
<li class="alt"><span>        </span></li>
<li><span>    <span class="keyword">function</span><span> get_url() {     </span></span></li>
<li class="alt"><span>            <span class="keyword">if</span><span> (!isset(</span><span class="vars">$_SERVER</span><span>[</span><span class="string">'REQUEST_URI'</span><span>])) {     </span></span></li>
<li><span>                    <span class="vars">$url</span><span> = </span><span class="vars">$_SERVER</span><span>[</span><span class="string">'REQUEST_URI'</span><span>];     </span></span></li>
<li class="alt"><span>            }<span class="keyword">else</span><span>{     </span></span></li>
<li><span>                    <span class="vars">$url</span><span> = </span><span class="vars">$_SERVER</span><span>[</span><span class="string">'SCRIPT_NAME'</span><span>];     </span></span></li>
<li class="alt"><span>                    <span class="vars">$url</span><span> .= (!emptyempty(</span><span class="vars">$_SERVER</span><span>[</span><span class="string">'QUERY_STRING'</span><span>])) ? </span><span class="string">'?'</span><span> . </span><span class="vars">$_SERVER</span><span>[</span><span class="string">'QUERY_STRING'</span><span>] : </span><span class="string">''</span><span>;     </span></span></li>
<li><span>            }     </span></li>
<li class="alt"><span>        </span></li>
<li><span>            <span class="keyword">return</span><span> </span><span class="vars">$url</span><span>;     </span></span></li>
<li class="alt"><span>    }    </span></li>
<li><span>    <span class="keyword">function</span><span> warn(</span><span class="vars">$errorstring</span><span>){   </span></span></li>
<li class="alt"><span>    <span class="func">echo</span><span> </span><span class="string">"<b><font color='red'>发生错误:<pre class="brush:php;toolbar:false">"</span><span>.</span><span class="vars">$errorstring</span><span>.</span><span class="string">"
";   
  •     }   
  •       
  •     function cache_page($pageurl,$pagedata){   
  •      if(!$fso=fopen($pageurl,'w')){   
  •       $this->warns('无法打开缓存文件.');//trigger_error   
  •       return false;   
  •      }   
  •      if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定   
  •       $this->warns('无法锁定缓存文件.');//trigger_error   
  •       return false;   
  •      }   
  •      if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式   
  •       $this->warns('无法写入缓存文件.');//trigger_error   
  •       return false;   
  •      }   
  •      flock($fso,LOCK_UN);//释放锁定   
  •      fclose($fso);   
  •      return true;   
  •     }   
  •       
  •     function display_cache($cacheFile){   
  •                 if(!file_exists($cacheFile)){   
  •         $this->warn('无法读取缓存文件.');//trigger_error   
  •         return false;   
  •                 }   
  •        echo '读取缓存文件:'.$cacheFile;   
  •     //return unserialize(file_get_contents($cacheFile));   
  •             $fso = fopen($cacheFile'r');   
  •             $data = fread($fsofilesize($cacheFile));   
  •             fclose($fso);   
  •      return $data;   
  •     }   
  •       
  •     function readData($cacheFile='default_cache.txt'){   
  •      $cacheFile = $this->cache_dir."/".$cacheFile;   
  •      if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){   
  •       $data=$this->display_cache($cacheFile);   
  •       }else{   
  •        $data="from here wo can get it from mysql database,update time is ".date('l dS \of F Y h:i:s A').",过期时间是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";   
  •        $this->cache_page($cacheFile,$data);   
  •      }   
  •       return $data;   
  •     }   
  •     }   
  •     ?>  


  • 声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。