サーバーに多数のファイルを保存する最良の方法

ご存じのように、1つのフォルダーに大量のファイルを保存しないでください。 システムクラッシュは非常に迅速に発生する可能性があります。または、単にファイルの読み取りが非常に遅くなります。



この問題を解決するために、多くのプログラマーはmd5ファイル名f789f789abc898d6892df98d09a8f8を使用し、次のように名前を分割します。



/f7/89/f789abc898d6892df98d09a8f8.jpg



ここでの計算は非常に簡単です-1文字は16オプションです。

したがって、2文字はすでに16 * 16 = 256オプションです。

この場合、それぞれ2文字のネストが2つあるため、フォルダーの最大数は256 * 256 = 65536フォルダーになります。

1,000,000個のファイルを保存する必要がある場合、各フォルダーのファイル数は1,000,000 / 65536 = 15ファイルを超えません。



はい、オプションは簡単ですが、ファイルを適切に保存するだけでなく、すばやく見つける必要がある場合はどうでしょうか?



たとえば、ソーシャルネットワークがあり、各ユーザーがID番号を持つ個別のフォルダーを作成し、その中にファイルを保存し、さらにそのフォルダーに独自のIDがあるようにします。

そして、私たちにとっては、ファイルを保存するだけでなく、idによってファイルの場所をすばやく見つけることも重要です。



この問題を解決するために、フォルダーツリー構造のサーバーに多数のファイルまたはフォルダーを保存できるクラスを作成しました。



クラスが作成する構造は次のとおりです。

画像



この構造に収まるファイルの最大数を計算するには、フォルダー内のファイルの最大数を、枝の数に1を加えた程度まで上げる必要があります。



この画像では、各フォルダーに2つのブランチと3つのファイルがあります。

したがって、3を2 + 1 = 3 * 3 * 3 = 27ファイルの累乗にする必要があります。



このような構造で1,000,000個以下のファイルを保存するには、各フォルダーに100個のファイルの2つのブランチ(100 * 100 * 100)で十分です。



パラメーターの配列をクラスに渡す必要があります-ツリーが構築されるフォルダーへのパス、フォルダー内のファイルの最大数、ブランチの数、または事前に計算されたファイルの最大数のパターン(パラメーター)を適用できます-bigint、int、mediumint、smallint:



配列( 'upload_dir' => Q_PATH。 '/ uploads /'、 'max_file_count' => 1000、 'branches' => 2、 'pattern' => '')



クラス自体:

<?php //file index define("Q_PATH",dirname(__FILE__)); // class Functions { public static function arr_union(array $def_arr,array $new_arr) { foreach($new_arr as $key => $value) { if(array_key_exists($key, $def_arr) && is_array($value)) { $def_arr[$key]=self::arr_union($def_arr[$key], $new_arr[$key]); } else { $def_arr[$key]=$value; } } return $def_arr; } } /** *    */ class Upload { public $id; private $upload_dir; private $max_file_count; private $branches; public function __construct(array $param=array()) { $def_param=array('upload_dir'=>Q_PATH.'/uploads/','max_file_count'=>1000,'branches'=>2,'pattern'=>''); $upload_param=Functions::arr_union($def_param,$param); $this->upload_dir=$upload_param['upload_dir']; $this->max_file_count=$upload_param['max_file_count']; $this->branches=$upload_param['branches']; // ,     df -i  tune2fs -l /dev/hda1  df -Ti switch($upload_param['pattern']) { case 'bigint': $this->max_file_count=512; $this->branches=6; break; case 'int': $this->max_file_count=216; $this->branches=3; break; case 'mediumint': $this->max_file_count=204; $this->branches=2; break; case 'smallint': $this->max_file_count=182; $this->branches=1; break; } $this->del_id(); } public function set_id($id) { $this->id=$id; } public function del_id() { $this->id=0; } public function find_upload($url) { if(is_file($url)) { return true; } else { return false; } } public function get_upload($id,$fl) { $this->set_id($id); for($i=$this->branches;$i>=1;$i--) { $dir=ceil($this->id/pow($this->max_file_count,$i))%$this->max_file_count; $dir_file_arr[]=$dir>0?$dir:$this->max_file_count; } $dir_file_str=implode("/", $dir_file_arr); return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl; } public function put_upload($id,$fl,$data) { $this->set_id($id); for($i=$this->branches;$i>=1;$i--) { $dir=ceil($this->id/pow($this->max_file_count,$i))%$this->max_file_count; $dir_file_arr[]=$dir>0?$dir:$this->max_file_count; $dir_file_str=implode("/", $dir_file_arr); if(!is_dir($this->upload_dir.$dir_file_str)) { mkdir($this->upload_dir.$dir_file_str, 0777); //chmod($this->upload_dir.$dir_file_str, 0777); } } file_put_contents($this->upload_dir.$dir_file_str.'/'.$this->id.$fl, $data); return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl; } public function set_upload($id,$fl) { $this->set_id($id); for($i=$this->branches;$i>=1;$i--) { $dir=ceil($this->id/pow($this->max_file_count,$i))%$this->max_file_count; $dir_file_arr[]=$dir>0?$dir:$this->max_file_count; $dir_file_str=implode("/", $dir_file_arr); if(!is_dir($this->upload_dir.$dir_file_str)) { mkdir($this->upload_dir.$dir_file_str, 0777); //chmod($this->upload_dir.$dir_file_str, 0777); } } return $this->upload_dir.$dir_file_str.'/'.$this->id.$fl; } public function get_upload_dir($id) { $this->set_id($id); for($i=$this->branches;$i>=1;$i--) { $dir=ceil($this->id/pow($this->max_file_count,$i))%$this->max_file_count; $dir_file_arr[]=$dir>0?$dir:$this->max_file_count; } $dir_file_str=implode("/", $dir_file_arr); return $this->upload_dir.$dir_file_str.'/'.$this->id; } public function set_upload_dir($id) { $this->set_id($id); for($i=$this->branches;$i>=1;$i--) { $dir=ceil($this->id/pow($this->max_file_count,$i))%$this->max_file_count; $dir_file_arr[]=$dir>0?$dir:$this->max_file_count; $dir_file_str=implode("/", $dir_file_arr); if(!is_dir($this->upload_dir.$dir_file_str)) { mkdir($this->upload_dir.$dir_file_str, 0777); //chmod($this->upload_dir.$dir_file_str, 0777); } } if(!is_dir($this->upload_dir.$dir_file_str.'/'.$this->id)) { mkdir($this->upload_dir.$dir_file_str.'/'.$this->id, 0777); //chmod($this->upload_dir.$dir_file_str.'/'.$this->id, 0777); } return $this->upload_dir.$dir_file_str.'/'.$this->id; } }
      
      







アーカイブでダウンロード



上記のソーシャルネットワークのバリアントでは、クラスを2回使用する必要があります。最初にフォルダーのツリーを構築し、次に各フォルダー内のファイルのツリーを構築します。



また、この投稿で「ハードディスク上のファイルの最大許容数」というトピックを省略しました(しかし、知りませんでした)ことにも注意してください。



All Articles