ホームページ >バックエンド開発 >PHPチュートリアル >PHPにおけるキャッシュ技術の応用を詳しく解説、PHPキャッシュ技術の解説_PHPチュートリアル
PHPは、近年登場したWebデザインスクリプト言語であり、そのパワーと拡張性により、近年大きな進歩を遂げています。従来の ASP Web サイトでは、MSSQL から PHP に 60,000 個のデータを転送する場合に 40 秒かかりますが、Web サイトではそれ以上の時間がかかります。データを呼び出すために、ファイルや特定のメモリ アドレスなどの他の場所からデータを呼び出す必要はありません。キャッシュ技術、つまりキャッシュ技術です
一般的に言えば、キャッシュの目的は、アクセスを高速化するためにデータを 1 か所に置くことです。メモリが最速であることは間違いありませんが、これはもちろん非現実的です。たとえば、ob_start() キャッシュ ページがオンになっている場合、ページ出力が自動的にクリアされるか待機するまで、ページ コンテンツはファイル ヘッダーを送信する前にメモリにキャッシュされます。 ob_get_contents の戻り値、[または ob_end_clean Clearance によって表示されます。これは静的ページの生成によく使用でき、テンプレートによく反映できます。これについては、私のこの記事で詳しく説明しています。
PHP による静的ページの生成について言えば、これは 1 つの方法ですが、一時的なものであり、問題を解決する良い方法ではありません。
さらに、ASP にはパブリックパラメータを保存できるオブジェクトアプリケーションがありますが、これも少しキャッシュですが、開発者がそのようなオブジェクトを生成するのを今のところ見たことがありません。 NET ページ キャッシュ このテクノロジはビューステートを使用し、キャッシュはファイルの関連付けです (必ずしも正確であるとは限りません)。ファイルが変更されずにタイムアウトしない場合 (注 1)、キャッシュが読み取られます。結果が返されます。これがこのソースコードを見てください。
classcache{ /* ClassName:cache Description:controltocachedata,$cache_out_timeisaarraytosavecachedatetimeout. Version:1.0 作者:old farmer cjjer Lastmodify:2006-2-26 AuthorURL:http://www. c jjer .com */ private$cache_dir; private$expireTime=180;//キャッシュ時間は60秒です function__construct($cache_dirname){ if(!@is_dir($cache_dirname)){ if(! @mkdir ($cache_dirname,0777)){ $this->warn(''キャッシュ ファイルが存在しないため作成できません。手動で作成する必要があります。''); returnfalse; } } $this->cache_dir=$cache_dirname; } function__destruct(){ echo''Cacheclassbye.''; } functionget_url(){ if(!isset($_SERVER[''REQUEST_URI''])) { $url=$_SERVER[ ''REQUEST_URI'']; }else{ $url=$_SERVER[''SCRIPT_NAME'']; $url.=(!empty($_SERVER[''QUERY_STRING'' ]))?''?' '.$_SERVER[''QUERY_STRING'']:''''; } return$url; } functionwarn($errorstring){ echo"< fontcolor=''red''> ;エラーが発生しました: ".$errorstring.""; } functioncache_page($pageurl,$pagedata) ){ if(!$fso= fopen($pageurl,''w'')){ $this->warns(''キャッシュされたファイルを開けません。'');//trigger_error returnfalse; } if(!flock($fso,LOCK_EX )){//LOCK_NB、排他ロック $this->warns(''キャッシュ ファイルをロックできません。'');//trigger_error returnfalse; } if( !fwrite($fso,$pagedata) ){//バイト ストリームを書き込み、シリアル化して他の形式を書き込みます $this->warns(''キャッシュ ファイルを書き込めません。'');//trigger_error returnfalse; } flock($fso,LOCK_UN );//ロックを解放します fclose($fso); returntrue; } functiondisplay_cache($cacheFile){ if(!file_exists($cacheFile)){ $this-> warn(''キャッシュ ファイルを読み取ることができません。'');//trigger_error returnfalse; } echo''キャッシュ ファイルを読み取ります:''.$cacheFile; //returnunserialize(file_get_contents($cacheFile)); $ fso=fopen($cacheFile, ''r''); $data=fread($fso,filesize($cacheFile)); fclose($fso); return$data; } functionreadData($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="fromherewocangetitfrommysqldatabase,updatetimeis".date(''ldSofFYh:i:sA'') ." 、有効期限は次のとおりです: ".date(''ldSofFYh:i:sA'',time()+$this->expireTime)。"---------- "; $this->cache_page($cacheFile,$data); } return$data; } } ?> |
このコードを中断して 1 行ずつ説明します。
3: プログラム透析
このキャッシュ クラス (このクラスでは何も恐れることはありません。読み続けてください) は、cache という名前が付けられ、2 つの属性があります:
private$expireTime=180; |
if(!@is_dir($cache_dirname)){ if(!@mkdir($cache_dirname,0777)){ $this->warn(''キャッシュ ファイルが存在しないため、作成できません。手動で作成する必要があります。''); returnfalse; } } $this->cache_dir=$cache_dirname; } |
echo''キャッシュクラスバイ。''; } |
echo"".$errorstring."< ; /b>"; } |
このメソッドはエラー情報を出力します。
$url=$_SERVER[''REQUEST_URI'']; }else{ $url=$_SERVER['' SCRIPT_NAME'']; $url.=(!empty($_SERVER[''QUERY_STRING'']))?''?''.$_SERVER[''QUERY_STRING'']:''''; } return$url; } |
$this->warns(''キャッシュ ファイルを開けません。'');/ /trigger_error returnfalse; } if(!flock($fso,LOCK_EX)){//LOCK_NB、排他ロック $this->warns(''キャッシュ ファイルをロックできません。'');//trigger_error returnfalse; } if(!fwrite($fso,$pagedata)){//バイトストリームを書き込み、シリアル化して他の形式を書き込みます $this->warns(''キャッシュ ファイルを書き込めません。'' );// trigger_error returnfalse; } flock($fso,LOCK_UN);//ロックを解除 fclose($fso); returntrue; } |
バイトストリームに書き込み、シリアル化して他の形式に書き込む
ちなみに、配列を書き込みたい場合 (MySQL データベースから結果を選択できます)、serialize 関数を使用して書き込み、unserialize を使用して元の型を読み取ります。
returnfalse; } echo''キャッシュ ファイルを読み取ります: ''.$cacheFile; //returnunserialize(file_get_contents($cacheFile)); $fso=fopen($cacheFile,''r''); $data=fread($fso,filesize( $cacheFile)); fclose($fso); return$data; } |
$data=$this->display_cache($cacheFile); }else{ $data="fromherewocangetitfrommysqldatabase,updatetimeis".date(''ldSofFYh: i:sA'')."、有効期限は次のとおりです: ".date(''ldSofFYh:i:sA'',time()+$this->expireTime)."---- - -----"; $this->cache_page($cacheFile,$data); } return$data; } |