2016-04-27 9 views
0

私はダイナミックなPHPページをキャッシュするためにある程度前にスタックオーバーフローで見つかったスクリプトを使用しています。それは私の基本的知識と統合することができます:D .htaccessを使用しないPHPコードだけですシンプルなPHPキャッシングがたくさんのファイルを作成する - サブフォルダが必要

キャッシングファイルの一意の名前を作成するためにURLのMD5ハッシュが作成されます。しかし、今は私のフォルダにたくさんのファイル(約300.000)があり、読み込み時間に関してftp経由でフォルダを開くのを待つのは面倒です。 1つのフォルダ内のファイル数を減らすために、最初の2文字をサブフォルダの名前として使用するソリューションを探しています。それが現時点でどのように動作する

  • URL:e72b0f58601e6d0c12f71a40b14101b7
  • ファイル:キャッシュ/ e72b0f58601e6d0c12f71a40b14101b7.html

ベストセラーソリューション:

  • URL:e72b0f58601e6d0c12f71a40b14101b7
  • ファイル:彼らは存在しない場合はキャッシュ/ E7/e72b0f58601e6d0c12f71a40b14101b7.html

サブフォルダが自動的に作成されなければなりません。誰かがコードを手伝ってくれますか、またはこの解決策に懸念がありますか?

substr-commandの使用については考えましたが、私の「実験」はうまく機能しませんでした。

ありがとうございます!

更新:返信のおかげで、私はコードを正常に編集することができました。あなたが解決策に興味があるなら、これらの行を更新する必要があります(stackflow/http://www.sanwebe.com/2013/09/php-cache-dynamic-pages-speed-up-load-times/ソース)

<?php 
//settings 
$cache_ext = '.html'; //file extension 
$cache_time  = 3600; //Cache file expires afere these seconds (1 hour = 3600 sec) 
$cache_folder = 'cache/'; //folder to store Cache files 
$ignore_pages = array('', ''); 

$dynamic_url = 'http://'.$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING']; // requested dynamic page (full url) 
$cache_file  = $cache_folder.md5($dynamic_url).$cache_ext; // construct a cache file 
$ignore = (in_array($dynamic_url,$ignore_pages))?true:false; //check if url is in ignore list 

if (!$ignore && file_exists($cache_file) && time() - $cache_time < filemtime($cache_file)) { //check Cache exist and it's not expired. 
    ob_start('ob_gzhandler'); //Turn on output buffering, "ob_gzhandler" for the compressed page with gzip. 
    readfile($cache_file); //read Cache file 
    echo '<!-- cached page - '.date('l jS \of F Y h:i:s A', filemtime($cache_file)).', Page : '.$dynamic_url.' -->'; 
    ob_end_flush(); //Flush and turn off output buffering 
    exit(); //no need to proceed further, exit the flow. 
} 
//Turn on output buffering with gzip compression. 
ob_start('ob_gzhandler'); 
######## Your Website Content Starts Below ######### 
?> 
<!DOCTYPE html> 
<html> 
    <head> 
     <title>Page to Cache</title> 
    </head> 
     <body> 
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer ut tellus libero. 
     </body> 
</html> 
<?php 
######## Your Website Content Ends here ######### 

if (!is_dir($cache_folder)) { //create a new folder if we need to 
    mkdir($cache_folder); 
} 
if(!$ignore){ 
    $fp = fopen($cache_file, 'w'); //open file for writing 
    fwrite($fp, ob_get_contents()); //write contents of the output buffer in Cache file 
    fclose($fp); //Close file pointer 
} 
ob_end_flush(); //Flush and turn off output buffering 

?> 

必要な変更は、私は、キャッシングのために使用している元のコード

コードの下に見つけることができます:

オリジナル:

$cache_folder = 'cache/'; //folder to store Cache files 
$dynamic_url = 'http://'.$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING']; // requested dynamic page (full url) 
更新

(動的URLは同じですが、原因異なるために、ここで言及されている):

$dynamic_url = 'http://'.$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING']; // requested dynamic page (full url) 
$cache_folder = 'cache/'.substr(md5($dynamic_url),0,2).'/'; //folder to store Cache files 

...

オリジナル:

更新
if (!is_dir($cache_folder)) { //create a new folder if we need to 
mkdir($cache_folder); 
} 

if (!is_dir($cache_folder)) { //create a new folder if we need to 
mkdir($cache_folder, 0777, true); 
} 
+1

md5ハッシュを分割して正しいディレクトリとファイルパスを生成するのは簡単です。これまでに何を試してみましたか? – jeroen

答えて

0

代わりの

$cache_file = $cache_folder.md5($dynamic_url).$cache_ext; // construct a cache file 
... 
if (!is_dir($cache_folder)) { //create a new folder recuirsively if we need to 
    mkdir($cache_folder); 
} 

使用

$cache_folder .= substr(md5($dynamic_url),0,2) . '/'; 
$cache_file = $cache_folder.md5($dynamic_url).$cache_ext; 
... 
if (!is_dir($cache_folder)) { //create a new folder if we need to 
     mkdir($cache_folder, 0777, true); 
} 

これは、新しいサブフォルダとしてファイル名の文字に最初に追加し、それが存在しない場合は、再帰的にそのフォルダが作成されます。

+0

ありがとうございますが、フォルダに関しては、サブフォルダではなくメインフォルダのみをチェックして作成しますか? – Amsel

+0

ちょっとした変更がありますが、あなたのアプローチではうまくいきます。どうもありがとう! :) あなたの解決策で私の質問を更新するつもりです – Amsel

+0

ようこそ。この答えがあなたの問題を解決するのに役立ったら、答えを「解決策」とマークするか、答えを上げることを検討してください。 – maxhb

-1

は、他のキャッシュメカニズムではなく、ファイルキャッシュを使用することを検討してください。

キャッシュストアとしてredisまたはmemcacheを使用する必要があります。全ページキャッシュ用にCDNソリューションを選択します。雲のような無料のCDNがあります。

+2

これは本当に答えではなく、もっとコメントです。 – jeroen

+0

ええ、私は将来的に別のテクニックを使用しますが、現時点では不可能です:() – Amsel

0

私はFTPで「フォルダを開く」操作を認識していないですロード時間

に関するftp経由でフォルダを開くときに待つようにその迷惑。確かにフォルダのリストを取得している場合は、データを転送してクライアントにレンダリングするのに時間がかかります。それはあなたがフォルダを見ることによって得られるものの質問を請う。

キャッシュ内の個々のアイテムを見つけ出し、追い出し候補を特定するのに、データが存在するファイルシステムに完全に依存している時間が問題になることがあります。その詳細やこれらのプロセスのタイミングについては説明しません。

300,000個のファイルが多数あります(正しい数字かもしれません)。また、これが予想されるかどうかについては何も示していません。 OTOHでは、キャッシュキーを生成する方法とアプリケーションに適しているかどうかの問題を指摘することがあります。 、サブフォルダを使用するだけで変更するには

$cache_file = $cache_folder.md5($dynamic_url).$cache_ext; 

$cache_file = $cache_folder.mk_hash_path($dynamic_url,$cache_folder).$cache_ext; 
... 

function mk_hash_path($dynamic_url,$cache_folder) 
{ 
    md5($dynamic_url); 
    $subfolders=4; 
    while ($subfolders--) { 
    $hash=substr($hash, -$subfolders, 1) . '/' . $hash; 
    } 
    if (!is_dir(dirname($cache_folder . $hash))) { 
     mkdir(dirname($cache_folder . $hash,0777, true)) 
    } 
    return $hash; 
} 

にしかし、多くのネッターのアイデアは、キャッシングリバースプロキシを使用することです。

+0

ありがとう、ありがとう!私の場合、ファイルの数は適切であることを意図しています;)スクリプトはたくさんのAPIを使用しているので、ロード速度とAPIサーバーへの要求数を減らすための最も簡単な解決策でした。しかし、私は将来、別のソリューション(memcache、ワニスなど)を使用する必要があることに同意します - しかしatm私はファイルベースのキャッシュ=)に滞在する必要があります 私は右の私は関数(mk_hash_path) cache_fileの変数宣言よりも上にあるのは、正しく実行するためか、それとも重要ではないからですか? – Amsel

+0

名前生成の変更だけでなく、関数も必要です。 – symcbean

+0

いいえ、ごめんなさい - ネイティブスピーカーではなく、コードの最初の行がコードの後ろにある関数を参照しているので、私はあなたのコードの時間順を意味していました。私はそれを実装しようとしましたが、この方法では失敗しました。しかし、私は最大のアプローチで成功した:)とにかくあなたに感謝 – Amsel

関連する問題