PHP (AWS SDK) i HostArena S3: primeri koda

PHP (AWS SDK) i HostArena S3: primeri koda

AWS SDK za PHP je zvanična biblioteka za rad sa S3 skladištem iz PHP koda. Pošto je HostArena S3 storage kompatibilan sa S3 standardom, istu biblioteku koristite i sa njim. Treba samo da podesite adresu servera, region garage i path-style adrese.

Šta vam je potrebno

PodatakVrednostGde ga nalazite
Endpointhttps://s3.hostarena.rsIsti za sve korisnike
RegiongarageObavezno tačno ovako
Bucketvas-bucketHostArena korisnički panel, kod S3 usluge
Access KeyVAS_ACCESS_KEYHostArena korisnički panel, kod S3 usluge
Secret KeyVAS_SECRET_KEYHostArena korisnički panel, kod S3 usluge

Potrebni su vam PHP i Composer. Ako radite u Laravel-u, pogledajte posebno uputstvo Laravel i HostArena S3.

Koraci

  1. U folderu projekta instalirajte biblioteku:

    composer require aws/aws-sdk-php
  2. Ključeve ne upisujte direktno u kod. Postavite ih kao promenljive okruženja. Na Linux-u i macOS-u:

    export AWS_ACCESS_KEY_ID="VAS_ACCESS_KEY"
    export AWS_SECRET_ACCESS_KEY="VAS_SECRET_KEY"

    U Windows PowerShell-u:

    $env:AWS_ACCESS_KEY_ID="VAS_ACCESS_KEY"
    $env:AWS_SECRET_ACCESS_KEY="VAS_SECRET_KEY"

    Ove komande važe za otvoreni terminal. Na serveru ih obično upisujete u podešavanja servisa, u .env fajl koji se ne objavljuje ili u alat za tajne podatke.

  3. Napravite fajl primer.php. Primer otprema fajl, ispisuje spisak fajlova i preuzima fajl na disk:

    <?php
    
    require __DIR__ . '/vendor/autoload.php';
    
    use AwsS3S3Client;
    use AwsS3ExceptionS3Exception;
    
    $bucket = 'vas-bucket';
    
    // Ključevi se čitaju iz promenljivih okruženja
    // AWS_ACCESS_KEY_ID i AWS_SECRET_ACCESS_KEY.
    $s3 = new S3Client([
        'version'                 => 'latest',
        'region'                  => 'garage',
        'endpoint'                => 'https://s3.hostarena.rs',
        'use_path_style_endpoint' => true,
        'credentials'             => [
            'key'    => getenv('AWS_ACCESS_KEY_ID'),
            'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
        ],
    ]);
    
    try {
        // Otpremanje lokalnog fajla
        $s3->putObject([
            'Bucket'     => $bucket,
            'Key'        => 'bekapi/bekap.zip',
            'SourceFile' => __DIR__ . '/bekap.zip',
        ]);
        echo "Otpremljeno" . PHP_EOL;
    
        // Spisak fajlova (radi i za više od 1000 fajlova)
        $pages = $s3->getPaginator('ListObjectsV2', ['Bucket' => $bucket]);
        foreach ($pages as $page) {
            foreach ($page['Contents'] ?? [] as $object) {
                echo $object['Key'] . ' ' . $object['Size'] . ' bajtova' . PHP_EOL;
            }
        }
    
        // Preuzimanje i snimanje na disk
        $s3->getObject([
            'Bucket' => $bucket,
            'Key'    => 'bekapi/bekap.zip',
            'SaveAs' => __DIR__ . '/vraceno.zip',
        ]);
        echo "Snimljeno: vraceno.zip" . PHP_EOL;
    } catch (S3Exception $e) {
        echo 'Greška: ' . $e->getAwsErrorCode() . ' - ' . $e->getAwsErrorMessage() . PHP_EOL;
    }

    Bitna podešavanja su 'region' => 'garage', 'endpoint' => 'https://s3.hostarena.rs' i 'use_path_style_endpoint' => true. Opcija SaveAs snima preuzeti fajl direktno na disk, bez učitavanja celog fajla u memoriju.

  4. Pokrenite primer (u istom terminalu u kom ste postavili ključeve):

    php primer.php

Ostale česte operacije

Upis teksta, čitanje u promenljivu i brisanje (koristi isti $s3 klijent):

// Upis teksta direktno iz promenljive
$s3->putObject([
    'Bucket' => 'vas-bucket',
    'Key'    => 'pozdrav.txt',
    'Body'   => 'Pozdrav sa HostArena S3!',
]);

// Čitanje sadržaja u promenljivu
$result = $s3->getObject(['Bucket' => 'vas-bucket', 'Key' => 'pozdrav.txt']);
echo (string) $result['Body'];

// Brisanje fajla
$s3->deleteObject(['Bucket' => 'vas-bucket', 'Key' => 'pozdrav.txt']);

Pažnja: deleteObject trajno briše fajl i ne pita za potvrdu. Obrisani fajl se ne može vratiti.

Provera da li fajl postoji. Greška 404 znači da fajla nema, a svaka druga greška se prosleđuje dalje, da ne bi bila sakrivena:

use AwsS3S3Client;
use AwsS3ExceptionS3Exception;

function postoji(S3Client $s3, string $bucket, string $key): bool
{
    try {
        $s3->headObject(['Bucket' => $bucket, 'Key' => $key]);
        return true;
    } catch (S3Exception $e) {
        if ($e->getStatusCode() === 404) {
            return false;
        }
        throw $e; // druga greška (npr. pogrešan ključ) se ne krije
    }
}

Privremeni link za preuzimanje koji važi 20 minuta, bez otvaranja bucketa za javnost:

$cmd = $s3->getCommand('GetObject', [
    'Bucket' => 'vas-bucket',
    'Key'    => 'dokument.pdf',
]);
$request = $s3->createPresignedRequest($cmd, '+20 minutes');
echo (string) $request->getUri();

Provera da radi

Stavite mali fajl bekap.zip pored skripte i pokrenite php primer.php. Ispravan ispis je „Otpremljeno”, zatim spisak fajlova i na kraju „Snimljeno: vraceno.zip”. Ako vidite „Greška:” sa kodom, pogledajte deo ispod.

Najčešći problemi

AuthorizationHeaderMalformed

Region nije dobar. Mora biti tačno garage. Sa us-east-1 ili bilo kojim drugim AWS regionom server odbija zahtev.

InvalidAccessKeyId, AccessDenied ili SignatureDoesNotMatch

Proverite da li su promenljive okruženja postavljene u istom terminalu ili servisu u kom pokrećete program i da ključevi nemaju razmak na početku ili kraju. Ključeve proverite u HostArena korisničkom panelu, kod S3 usluge.

NoSuchBucket

Naziv bucketa nije tačan. Prepišite ga iz HostArena korisničkog panela. Endpoint ostaje https://s3.hostarena.rs, bez naziva bucketa u adresi.

Greška vezana za checksum pri otpremanju

Novije verzije AWS SDK-a same dodaju kontrolni zbir (checksum) svakom otpremanju. Ako dobijete grešku koja pominje checksum, dodajte u podešavanja klijenta sledeće dve opcije:

$s3 = new S3Client([
    // ... ista podešavanja kao gore, plus:
    'request_checksum_calculation' => 'when_required',
    'response_checksum_validation' => 'when_required',
]);

Zaključak

Isti princip važi i za druge jezike: Python (boto3), Node.js i Go. Tehnički detalji o adresama i potpisivanju zahteva nalaze se u uputstvu HostArena S3 API: adrese, potpisivanje i kompatibilnost. Nemate S3 uslugu? Pogledajte pakete na stranici HostArena S3 storage. Ako zapne, otvorite tiket u korisničkom panelu.

Tags: , , ,