スポンサーリンク

スピードや相手の負荷軽減などのために、
web apiの結果をローカルのディスクにキャッシュしている。
1つのディレクトリにどんどん入れていくと、lsすると超遅かったり、
そもそも1つのディレクトリに作れるファイル数に達したらどうするのよ
とか、問題がある。
また1つのディレクトリにファイルが増えるとルックアップが遅くなる。

というわけで、ディレクトリをわけようということになる。

前提として、キャッシュファイルのファイル名は、md5である。

256 + 256 * 256 + 256 * 256 * 256 = 16,843,008 のディレクトリを作成する。
ディレクトリは、00からffまで。

ディレクトリを作成する dir.php
<?php
function make_directory_256_level3 ($basedir) {
	for ($i = 0; $i < 256; $i++) {
		$x = sprintf ("%02x", $i);
		for ($j = 0; $j < 256; $j++) {
			$y = sprintf ("%02x", $j);
			for ($k = 0; $k < 256; $k++) {
				$z = sprintf ("%02x", $k);
				$d = "$x/$y/$z";
				$mode = 0777;
				$recursive = true;
				mkdir ($basedir .'/'.$d,
						$mode, $recursive);
			}
		}
	}
}
make_directory_256_level3 ('.');
?>

パスとファイル名の決定

ハッシュ値から2文字ずつ取り出して、ディレクトリを決定する。
<?php

$hash = md5 ($url);
$hash_dir = '';
if (preg_match ('/^(..)(..)(..)/', $hash, $match) ) {
	$hash_dir = $match[1] . '/' . $match[2] . '/' . $match[3] . '/';
	$filepath = $api_cache_dir . '/' . $hash_dir . $hash;
}

?>

追記
上記のコードだとディレクトリができすぎて、inodeがいっぱいになって
ファイルが作れなくなってしまうので、レベル2までにした。

ディレクトリを作成する dir2.php
<?php
function make_directory_256_level2 ($basedir) {
	for ($i = 0; $i < 256; $i++) {
		$x = sprintf ("%02x", $i);
		for ($j = 0; $j < 256; $j++) {
			$y = sprintf ("%02x", $j);
			$d = "$x/$y";
			$mode = 0777;
			$recursive = true;
			mkdir ($basedir .'/'.$d, $mode, $recursive);
			}
		}
	}
}
make_directory_256_level2 ('.');
?>

パスとファイル名の決定

ハッシュ値から2文字ずつ取り出して、ディレクトリを決定する。
<?php
$hash = md5 ($url);
$hash_dir = '';
if (preg_match ('/^(..)(..)/', $hash, $match) ) {
	$hash_dir = $match[1] . '/' . $match[2] . '/';
	$filepath = $api_cache_dir . '/' . $hash_dir . $hash;
}
?>

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー