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
| Podatak | Vrednost | Gde ga nalazite |
|---|---|---|
| Endpoint | https://s3.hostarena.rs | Isti za sve korisnike |
| Region | garage | Obavezno tačno ovako |
| Bucket | vas-bucket | HostArena korisnički panel, kod S3 usluge |
| Access Key | VAS_ACCESS_KEY | HostArena korisnički panel, kod S3 usluge |
| Secret Key | VAS_SECRET_KEY | HostArena 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
U folderu projekta instalirajte biblioteku:
composer require aws/aws-sdk-phpKljuč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
.envfajl koji se ne objavljuje ili u alat za tajne podatke.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. OpcijaSaveAssnima preuzeti fajl direktno na disk, bez učitavanja celog fajla u memoriju.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.
