Работа с S3 и облачными хранилищами в PHP
Облачные объектные хранилища, совместимые с протоколом Amazon S3 (Simple Storage Service), стали стандартом де-факто для хранения файлов, изображений, резервных копий и статического контента. PHP предоставляет мощные инструменты для интеграции с такими хранилищами, как AWS S3, MinIO (self-hosted), DigitalOcean Spaces, Wasabi, Yandex Object Storage и другими. В этой статье мы подробно рассмотрим, как работать с S3-совместимыми хранилищами в PHP, используя официальный AWS SDK и альтернативные библиотеки.
Основные понятия S3
Прежде чем перейти к коду, важно понимать ключевые концепции S3:
- Бакет (Bucket) — контейнер для объектов (файлов). Имя бакета должно быть глобально уникальным (для публичных облаков).
- Объект (Object) — файл и его метаданные. Каждый объект имеет ключ (Key) — путь к файлу внутри бакета.
- Регион (Region) — географическое расположение хранилища.
- Credentials — ключ доступа (Access Key ID) и секретный ключ (Secret Access Key) для аутентификации.
- Endpoint — URL хранилища (для S3-совместимых сервисов, отличных от AWS, endpoint обязателен).
Установка AWS SDK для PHP
Официальная библиотека для работы с S3 — aws/aws-sdk-php. Установка через Composer:
composer require aws/aws-sdk-php
Для работы с MinIO или DigitalOcean Spaces дополнительных зависимостей не требуется — SDK поддерживает кастомные endpoints.
Базовая настройка клиента S3
Создадим клиент для подключения к AWS S3:
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
'version' => 'latest',
'region' => 'us-east-1',
'credentials' => [
'key' => 'YOUR_ACCESS_KEY',
'secret' => 'YOUR_SECRET_KEY',
],
]);
?>
Для MinIO (локальное S3-совместимое хранилище) конфигурация будет выглядеть так:
<?php
$s3Client = new S3Client([
'version' => 'latest',
'region' => 'us-east-1', // MinIO игнорирует регион
'endpoint' => 'http://localhost:9000',
'use_path_style_endpoint' => true,
'credentials' => [
'key' => 'minioadmin',
'secret' => 'minioadmin',
],
]);
?>
Обратите внимание на параметр use_path_style_endpoint — он необходим для MinIO и некоторых не-AWS хранилищ.
Управление бакетами
Создание бакета
<?php
try {
$result = $s3Client->createBucket([
'Bucket' => 'my-php-bucket',
]);
echo "Бакет создан: " . $result['Location'];
} catch (AwsException $e) {
echo "Ошибка: " . $e->getMessage();
}
?>
Проверка существования бакета
<?php
$exists = $s3Client->doesBucketExist('my-php-bucket');
if ($exists) {
echo "Бакет существует";
} else {
echo "Бакет не найден";
}
?>
Список всех бакетов
<?php
$buckets = $s3Client->listBuckets();
foreach ($buckets['Buckets'] as $bucket) {
echo $bucket['Name'] . " (создан: " . $bucket['CreationDate'] . ")<br>";
}
?>
Загрузка файлов в S3
Загрузка из строки (текстовые данные)
<?php
try {
$result = $s3Client->putObject([
'Bucket' => 'my-php-bucket',
'Key' => 'hello.txt',
'Body' => 'Hello, S3 from PHP!',
]);
echo "Файл загружен. URL: " . $result['ObjectURL'];
} catch (AwsException $e) {
echo "Ошибка загрузки: " Также в библиотеке
Redis клиент для C++: подключение, установка и примеры использования
Swagger/OpenAPI генерация для Java: библиотеки и инструменты
Обработка изображений в Kotlin: resize и crop с библиотекой Kamel
cobra/pflag для Go: полное руководство с примерами
Обработка изображений на Go: изменение размера и обрезка (resize, crop)