Работа с S3 и облачными хранилищами в PHP: полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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 "Ошибка загрузки: "                    

Рекомендаций