Mal ein kleines Cloud- und Cluster-Thema.
Amazon S3 ist ein einfacher Key-Value Store, wo man auch sehr große Daten unterbringen kann. Gerade wenn man Dateien nicht auf dem selben Server speichern möchte oder ein Cluster betreiben will, ist S3 eine gute Alternative zu FTP oder NFS-Laufwerken. Der Server ist über HTTP zu erreichen und es gibt für alle möglichen Sprachen Clients. Eine S3 kompatible Implementierung ist
MinIO. Ich hab hier ein kleines Beispiel gebaut, wo ich ein Bild hochlade und wieder downloade und danach alles auch wieder aufräume. Metadata habe ich auch genutzt. Wenn man komplexere Anwendungen hat wird man wohl eher nicht SaveAs verwenden sondern den mitgelieferten Stream aus dem Array verwenden.
Das Minio Docker-Image:
sudo docker pull minio/minio
sudo docker run -p 9080:9000 -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" -e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" minio/minio server /data
Der S3-Client für PHP:
php composer.phar require aws/aws-sdk-php
meine test.php:
<?php
require 'vendor/autoload.php';
if(file_exists('./testdata/down.png')){
unlink('./testdata/down.png');
}
$s3 = new Aws\S3\S3Client([
'version' => 'latest',
'region' => 'us-east-1',
'endpoint' => 'http://localhost:9080',
'use_path_style_endpoint' => true,
'credentials' => [
'key' => 'AKIAIOSFODNN7EXAMPLE',
'secret' => 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
],
]);
try{
$s3->createBucket([
'Bucket' => 'testimagebucket'
]);
$s3->waitUntil('BucketExists', ['Bucket' => 'testimagebucket']);
}
catch(Exception $e){
echo $e->getMessage();
}
$insert = $s3->putObject([
'Bucket' => 'testimagebucket',
'Key' => 'image01',
'SourceFile' => './testdata/test_01.png',
'Metadata' => [
'Filename' => 'test_01.png',
],
]);
echo "Uploaded the image\n";
$retrive = $s3->getObject([
'Bucket' => 'testimagebucket',
'Key' => 'image01',
'SaveAs' => './testdata/down.png'
]);
echo "Saved " . $retrive['Metadata']['Filename'] . " to down.png\n";
try{
$s3->deleteObject([
'Bucket' => 'testimagebucket',
'Key' => 'image01',
]);
$s3->deleteBucket(['Bucket' => 'testimagebucket']);
}
catch(Exception $e){
echo $e->getMessage();
}