MongoDB를 PHP에서 파일 저장소로 사용

Syed Hassan Sabeeh Kazmi 2023년6월20일
MongoDB를 PHP에서 파일 저장소로 사용

대용량 파일을 위한 확장 가능한 스토리지 생성과 관련하여 MongoDB 및 해당 GridFS(MongoDB Query Language - MQL로 작성)는 시장에서 가장 우수한 파일 스토리지 솔루션 중 하나입니다. 이 자습서에서는 MongoDB를 PHP의 파일 저장소로 사용하는 방법을 배웁니다.

파일 컬렉션의 모든 부분에 대한 쿼리 프로세스를 용이하게 하고 작업 집합에 필요한 데이터를 로드하여 다른 쿼리와 동일한 프로세스를 생성합니다(작업 집합은 데이터 또는 로드된 데이터 집합을 나타냄). 주어진 시간에) 최적의 성능을 향상하거나 유지하기 위해 주어진 시간 프레임 내에서 MongoDB에 필요합니다. 또한 RAM에 페이징하여 쿼리(저장, 전송, 데이터/파일 조작)를 수행합니다.

읽기 성능은 RAM에서 직접 작은 파일에 대해 우수할 수 있고 반면에 큰 파일에 대해 더 좋을 수 있으므로 다양합니다. 대부분의 컴퓨터에는 600GB 이상의 RAM이 없으며 단일 mongod 인스턴스에서 단일 파일의 600GB 이상의 파티션을 쉽게 처리할 수 있기 때문에 예상됩니다.

여기에서 고려해야 할 중요한 사항은 청크의 기본 또는 평균 크기가 256KB라는 것입니다. 이는 600GB 파일 컬렉션에 대해 엄청난 양의 문서를 만듭니다. 그러나 대부분의 드라이버에서 이 설정을 조작할 수 있습니다. GridFS는 다른 컬렉션과 마찬가지로 기본 잠금(데이터베이스 수준 2.2 이상 또는 전역 수준 2.2 이전)을 사용합니다.

데이터베이스 수준 2.2+와 전역 수준 2.2 이전은 서로 간섭하며 깊이 있는 이해를 통해 작성 중인 문서를 일관되게 읽을 수 있습니다.

드라이버가 구현되는 서버는 GridFS에 대해 전혀 알지 못하며 서버 측에서 GridFS 데이터의 특별한 해상도가 없음을 의미합니다. PHP 프로젝트에서 MongoDB를 사용하여 GridFS를 구현하는 방법을 배우게 되며 시나리오 세부 사항, 트래픽, 동시 쓰기/읽기 수 및 기타 여러 항목에 따라 경합 가능성이 있으므로 읽기/읽기에 대한 잠금이 있을 수 있습니다. 경우에 따라 쓰기 작업.

MongoDB에서 GridFS를 파일 저장소로 사용

크기가 증가하는 파일(BSON 파일의 기본 제한인 16MB 이상)은 더 강력한 스토리지 시스템이 필요하며 GridFS는 파일을 청크로 분할하여 각 청크를 별도의 파일/문서로 저장/처리하므로 큰 파일을 처리할 수 있습니다. 파일을 단일 문서로 저장하는 대신. 기본 청크 크기는 255KB이며 한 컬렉션에 저장하고 파일 메타데이터를 다른 컬렉션에 저장합니다.

시스템 수준 파일 시스템은 대용량 파일을 처리할 수 없으며 MongoDB 데이터베이스에 저장하는 것이 더 효율적입니다. GridFS는 전체 문서를 메모리에 로드하지 않고 대용량 파일의 일부에서 정보에 액세스할 수 있는 완벽한 솔루션이며, 디렉토리의 데이터/스토리지 제한을 늘리는 성능 최적화 솔루션입니다.

또한 지리적으로 분산된 복제본 세트(여러 mongod 인스턴스에 데이터 배포)를 사용할 때 문서, 파일 및 메타데이터 동기화를 지원하고 여러 시스템에 데이터를 배포하여 파일과 해당 메타데이터를 효율적이고 자동으로 배포할 수 있습니다. GridFS는 프로그래머가 MongoDB 드라이버 또는 mongofiles 명령줄 도구를 사용하는 것을 포함하여 두 가지 방법으로 데이터를 저장하고 배포할 수 있도록 합니다.

chunksfiles 컬렉션을 포함하여 GridFS에서 작동하는 두 가지 유형의 컬렉션이 있습니다. 또한 fs.chunks에 의한 chunks 컬렉션과 fs라는 벅에 대한 fs.files에 의한 files 컬렉션을 나타냅니다.

/*
prerequisites

i) MongoDB 3.0 or higher
ii) PHP Driver

[Remember| install both on the same server]

This example will store a >1GB video on a MongoDB server.

the source code `mkdir src` must be stored in a directory so create one
to create a successful connection and understanding between your files and storage, create a settings file
your new directory will contain a `Settings.php` file with the following PHP contents:
*/

<?php
    # Remember| PHP 7.0 allows you to have one `define` using an array
    define("USERNAME_MONGODB", "[your_username]");
    define("PASSWORD_MONGODB", "[your_password]");
    define("DATABASE_MONGODB", "[your_databaseName]");
    define("SERVERIP_MONGODB", "[your_serverIP or your_hostname]");

    // the following script will enable file storage so you can store a file
    require_once(__DIR__ . '/Settings.php');

    if (!isset($argv[1]))
    {
        die("Please mention/pass the filepath to the file you want to store in MongoDB Server.");
    }

    $storage_filepath = $argv[1];

    if (!file_exists($storage_filepath) || is_dir($storage_filepath))
    {
        die("Invalid! Please, re-check your filepath.");
    }


    function mongo_Connect($your_username, $your_password, $your_database, $your_host_serverIP)
    {
        $con_MongoDB = new Mongo("mongodb://{$your_username}:{$your_password}@{$your_host_serverIP}"); // Connect to Mongo Server
        $con_database = $con_MongoDB -> selectDB($your_database); // Connect to Database
        return $con_database;
    }

    $con_database = mongo_Connect(
        USERNAME_MONGODB,
        PASSWORD_MONGODB,
        DATABASE_MONGODB,
        SERVERIP_MONGODB
    );

    $grid_FS = $con_database -> getGridFS();

    # you can stick any metadata here, e.g., upload the owner's ID, date of execution, etc.
    $add_metadata = array("date" => new MongoDate());
    $storage_filepath = $storage_filepath;
    $grid_FS -> storeFile($storage_filepath, array("metadata" => $add_metadata));

    // You can execute the script using the php `StoreFile.php` "filename.com.avi"
    // list files with the file size
    require_once(__DIR__ . '/Settings.php');

    function _mongoConnect($your_username, $your_password, $your_database, $your_host_serverIP)
    {
        $con_MongoDB = new Mongo("mongodb://{$your_username}:{$your_password}@{$your_host_serverIP}"); // Connect to Mongo Server
        $con_database = $con_MongoDB -> selectDB($your_database); // Connect to Database
        return $con_database;
    }

    $con_database = _mongoConnect(
        USERNAME_MONGODB,
        PASSWORD_MONGODB,
        DATABASE_MONGODB,
        SERVERIP_MONGODB
    );

    $grid_FS = $con_database -> getGridFS();

    # Loop over the files and output their names and file sizes
    $storage_files = $grid_FS -> find();

    while (($your_file = $storage_files -> getNext()) != null)
    {
        print $your_file -> getFilename() . "\t" . $your_file -> getSize() . PHP_EOL;
    }

    // retrieve files
    require_once(__DIR__ . '/Settings.php');

    if (!isset($argv[1]))
    {
        die("Please mention/pass the filepath to the file you want to store in MongoDB Server.");
    }

    $storage_filepath = $argv[1];

    if (!file_exists($storage_filepath) || is_dir($storage_filepath))
    {
        die("Invalid! Please, re-check your filepath.");
    }

    function mongoConnect($your_username, $your_password, $your_database, $your_host_serverIP)
    {
        $con_MongoDB = new Mongo("mongodb://{$your_username}:{$your_password}@{$your_host_serverIP}"); // Connect to Mongo Server
        $con_database = $con_MongoDB -> selectDB($your_database); // Connect to Database
        return $con_database;
    }

    $con_database = mongoConnect(
        USERNAME_MONGODB,
        PASSWORD_MONGODB,
        DATABASE_MONGODB,
        SERVERIP_MONGODB
    );

    $grid_FS = $con_database -> getGridFS();

    # in the following code, you can search for the filepath passed in as the first argument
    $search_fileParams = array("filename" => $storage_filepath);

    if (false)
    {
        # If you used absolute paths when storing files, then you could use the following to download a folder's contents.
        $folder = '/path/to/folder';

        # Refer to https://secure.php.net/manual/en/class.mongoregex.php
        $file_get_filename = new MongoRegex("/^$folder");

        $search_fileParams = array(
            'filename' => $file_get_filename
        );
    }

    # Alternatively, use findOne($search_fileParams) if you expect only one file with the provided name.
    $storage_files = $grid_FS -> find($search_fileParams);

    while (($your_file = $storage_files -> getNext()) != null)
    {
        # Use a random string in case there is a file with the same name in the current directory.
        $random_string = substr(str_shuffle(MD5(microtime())), 0, 10);
        $outputFile_path = __DIR__ . '/' . $random_string . "_" . basename($your_file -> getFilename());
        $your_file -> write($outputFile_path);
        print "Retrieved: " . $outputFile_path . PHP_EOL;
    }

    // use the script like
    // php RetrieveFiles.php "my_filename.mp4"
?>

출력:

Retrieved: my_filename.mp4

CLI 도구가 아닌(StoreFile() 메서드를 사용하는 대신) PHP 웹 사이트를 개발하는 경우 StoreUpload() 메서드를 사용하십시오. 상대 또는 전체 경로를 사용하여 시스템에 파일을 저장하고 MongoDB에 저장된 파일 이름은 /path/to/file.mp4 및 파일 이름과 같은 전체 경로를 전달하면 전달된 정확한 문자열이 됩니다. 같을 것입니다.

동일한 파일에서 스크립트를 여러 번 호출해도 실패하지 않는다는 점을 기억하십시오. 그러나 이렇게 하면 동일한 파일을 여러 번 저장하는 귀중한 스토리지 리소스를 낭비할 수 있습니다. PHP 코드 예제는 MongoDB를 PHP 웹사이트 또는 프로젝트의 기본 스토리지로 사용하는 방법을 보여줍니다.

Hadoop과 HDFS는 MongoDB의 훌륭한 대안이지만 매우 복잡합니다. 그러나 MongoDB에 비해 Map/Reduce 작업을 지원합니다. 가장 중요한 것은 GridFS의 구현이 드라이버 자체 내에서 클라이언트 측에 있기 때문에 GridFS가 최고의 옵션이라는 것입니다(특별한 로드 또는 파일 컨텍스트 이해 없음).

MongoDB 및 해당 GridFS는 드라이버로 구현되며 드라이버를 사용하면 file 컬렉션에서 문서 컬렉션을 쿼리할 수 있고 프로그래머가 나중에 단일 쿼리로 chunks 컬렉션에서 파일 자체를 제공할 수 있으므로 사양이 다를 수 있습니다. . file 컬렉션과 후속 chunks 컬렉션을 작업 세트로 쉽게 로드할 수 있습니다.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub