厳密に判断しないでください-このプロジェクトはかなり前に書かれたもので、それ以来fidel.ru、tracksflow.comで変更なしで使用されています。 オープンアクセスでレイアウトする前に、それを少しとかしました。
このコードは、大規模な(そうではない)ファイル用のストレージシステムを最小限の労力で実装したい人を対象としています。
長所
- コンパクトなコード-簡単に確認して修正できます
- 保存されたコンテンツの量による優れたスケーラビリティ
- データベースの欠如
- 任意のサイズのファイルを操作する機能*
*大きなファイルで正しく動作しない可能性がある唯一の機能は、md5ファイルの量を確認することです。 この関数は、TimeOutExceptionを発生させる場合があります。
仕組み
ファイルはデータのチャンクでダウンロードされます-チャンクごとに1つのPOST要求。 ダウンロードは順次行われます。 次の要求を処理するとき、サーバーは受信した部分を結果のファイルに追加します。 すべての操作は、ターゲットファイルの長さに不変です。
すべてのファイルは、ディレクトリ構造内のファイルシステムに保存されます。
/<_>//<___id>/<___id>/<-__id>/<filename.ext>
, .
Nginx X-ACCEL_REDIRECT . Nginx.
Nginx + php-fpm. nginx :
server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }
/<_>//<___id>/<___id>/<-__id>/<filename.ext>
, .
Nginx X-ACCEL_REDIRECT . Nginx.
Nginx + php-fpm. nginx :
server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }
/<_>//<___id>/<___id>/<-__id>/<filename.ext>
, .
Nginx X-ACCEL_REDIRECT . Nginx.
Nginx + php-fpm. nginx :
server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }
/<_>//<___id>/<___id>/<-__id>/<filename.ext>
, .
Nginx X-ACCEL_REDIRECT . Nginx.
Nginx + php-fpm. nginx :
server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }
-
/<_>//<___id>/<___id>/<-__id>/<filename.ext>
, .
Nginx X-ACCEL_REDIRECT . Nginx.
Nginx + php-fpm. nginx :
server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }
/<_>//<___id>/<___id>/<-__id>/<filename.ext>
, .
Nginx X-ACCEL_REDIRECT . Nginx.
Nginx + php-fpm. nginx :
server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }
-
/<_>//<___id>/<___id>/<-__id>/<filename.ext>
, .
Nginx X-ACCEL_REDIRECT . Nginx.
Nginx + php-fpm. nginx :
server { listen <your_LAN_ip>; server_name <you_file_storage_hostname>; location /<location_name> { internal; root <storage_root_path_should_be_the_same_in_lib.php>; } location ~ \.php { root /<path_to_php_code>; fastcgi_pass 127.0.0.1:9000; #fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /<path_to_php_code>/$fastcgi_script_name; include fastcgi_params; } }
スケーリングする方法
保存されているファイルの量でスケーリングする場合、複数のサーバーを使用する必要があります。 この場合、必要な数のサーバーにLufsをインストールし、Webサーバーにファイルシステムをマウントして、ローカルディレクトリと同様に操作すると便利です。
ユースケース
このソリューションでは、ユーザーアバターとプレイリストカバーを保存します。 したがって、エンティティのタイプごとに2つのスペース(スコープ)を使用します。 各画像の識別子は、データベース内のエンティティの識別子と同じです。 ファイル名は、エンティティのファイルタイプとjpg拡張子を定義するサイズsysnem(たとえば、ImageLarge)で構成されます。 このアプローチでは、エンティティの識別子のみを認識し、エンティティに対応するファイルタイプのディレクトリを作成して、ファイルへのリンクを作成できます。
参照資料
Gitソリューションリポジトリ: https : //github.com/tracksflow/FileStorage
もちろん、 TracksFlow.comに招待します。 このサービスは活発に開発されているので、長く滞在していなければ間違いなく面白いものを見つけるでしょう。 まあ、まだされていない人のために-今日、私たちは会社の従業員にPMでリクエストを送信するすべての人に招待を配布しています(メッセージにメールアドレスを示すことを忘れないでください)。