Utiliser MinIO comme stockage de données objets en PHP

Je travaille sur un projet où il est question de stocker un grand nombre de fichiers. Ce dernier devrait être hébergé dans le Cloud et notamment sur des infrastructures orientées Serverless. Il est donc impensable d'utiliser un système de fichiers "classique" pour stocker des fichiers. Je me suis donc tourné vers les systèmes de stockage objet (type Amazon S3). C'est alors qu'en effectuant quelques recherches, j'ai découvert MinIO. Il s'agit d'un serveur de stockage open source compatible Amazon S3.

Pour utiliser MinIO avec PHP, vous pouvez simplement utiliser le SDK d'AWS. Après avoir créé votre bucket dans le serveur MinIO, vous pouvez commencer à travailler avec le système de fichier comme vous le feriez avec S3:

$s3 = new Aws\S3\S3Client([
    'version' => 'latest',
    'region'  => 'eu-east-1', // cette configuration n'a pas d'importance pour MinIO
    'endpoint' => 'http://localhost:9000',
    'use_path_style_endpoint' => true, // ce paramètre doit obligatoirement être actif
    'credentials' => [
        'key'    => 'ACCESSKEYID',
        'secret' => 'SECRETACCESSKEY',
    ],
]);

// enregistrer un fichier
$insert = $s3->putObject([
     'Bucket' => 'bucket',
     'Key'    => 'key',
     'Body'   => 'Hello from MinIO!!',
]);

// récupérer un fichier
$retrive = $s3->getObject([
     'Bucket' => 'bucket',
     'Key'    => 'key',
     'SaveAs' => 'key_local',
]);

Voila, ce n'est guère plus compliqué.

Pour ma part, lorsque je travaille avec le système de fichiers, j'ai pour habitude d'utiliser la bibliothèque Flysystem. Si vous ne connaissez pas Flysystem, je vous recommande vivement de vous y intéresser. Il s'agit de composant permettant d'abstraire l'accès à tout système de fichiers. Cela vous permettra d'écrire un code qui sera automatiquement compatible avec votre système de fichiers local, un FTP, mais également un grand nombre de fournisseur Cloud tel que Amazon S3 ou Azure Blob Storage.

Une fois le composant de base league/flysystem et l'extension league/flysystem-aws-s3-v3 installé avec l'aide de Composer. Il vous suffit de créer l'adapteur qui va bien:

$s3 = new Aws\S3\S3Client([
    'version' => 'latest',
    'region'  => 'eu-east-1', // cette configuration n'a pas d'importance pour MinIO
    'endpoint' => 'http://localhost:9000',
    'use_path_style_endpoint' => true, // ce paramètre doit **obligatoirement** être actif
    'credentials' => [
        'key'    => 'ACCESSKEYID',
        'secret' => 'SECRETACCESSKEY',
    ],
]);

$adapter = new League\Flysystem\AwsS3v3\AwsS3Adapter($client, 'bucket');
$filesystem = new League\Flysystem\Filesystem($adapter);

// enregistrer un fichier
$filesystem->put('my-file.txt', 'Hello from MinIO!!');

// récupérer un fichier
$object = $filesystem->get('my-file.txt');

Si vous utilisez Symfony, en ce qui me concerne j'utilise le bundle oneup/flysystem-bundle. Pour Laravel le composant le plus complet semble être graham-campbell/flysystem.

Tout ça pour dire, que si vous souhaitez utiliser un système de stockage objet et que vous souhaitez héberger vous même ce dernier, je ne peux que vous conseiller de jeter un coup d'oeil à MinIO.