Programmering med Yii2 Bruke Amazon S3

Hva du skal skape

Hvis du spør, "Hva er Yii?" sjekk ut min tidligere opplæring, Introduksjon til Yii Framework, som vurderer fordelene med Yii og inneholder en oversikt over hva som er nytt i Yii 2.0, utgitt i oktober 2014.

I denne programmeringen med Yii2-serien, veileder jeg lesere i bruk av Yii2 Framework for PHP. I dagens veiledning vil jeg gå gjennom grunnleggende om surfing, opplasting og nedlasting av filer til og fra Amazons skybaserte S3-lagringstjeneste. I hovedsak har jeg opprettet en enkel lagringsmodell og kontroller som eksempler som du kan utvide etter dine behov.

Bare en påminnelse, jeg deltar i kommentar tråder nedenfor. Jeg er spesielt interessert hvis du har forskjellige tilnærminger, flere ideer, eller ønsker å foreslå emner for fremtidige opplæringsprogrammer. Hvis du har et spørsmål eller et emneforslag, vennligst legg inn under. Du kan også nå meg på Twitter @ reifman direkte.

Hva er Amazon S3?

Amazon S3 gir enkel å bruke, avansert skybasert lagring for objekter og filer. Den tilbyr 99,99% tilgjengelighet og 99,999999999% holdbarhet av gjenstander.

Den tilbyr en rekke funksjoner for enkel eller avansert bruk. Den brukes vanligvis som lagringskomponent for Amazons CDN-tjeneste CloudFront, men disse er forskjellige og kan brukes uavhengig av hverandre.

Du kan også bruke S3 til å migrere filer over tid for å arkivere i Amazon Glacier, for ekstra kostnadsbesparelser.

Som de fleste alle AWS opererer du S3 via APIer, og i dag skal jeg gå gjennom nettleser, laster opp og laster ned filer fra S3 med Yii.

Starter

For å kjøre demonstrasjonskoden trenger du din egen Amazon AWS-konto og tilgangsnøkler. Du kan bla gjennom S3-treet fra AWS-konsollen som vist nedenfor:

S3 består av bøtter som holder mange kataloger og filer innenfor dem. Siden jeg pleide å bruke AWS som en CDN, forblir mitt WordPress-tre i min gamle bøtte. Du kan også bla gjennom din bøtte:

Når jeg krysser objektets tre, er det et dypere bilde av bøtteinnholdet mitt:

Programmering med S3

Igjen skal jeg bygge på hei-treet fra GitHub for vår demonstrasjonskode (se lenken på denne siden.) Den er avledet fra Yii2 basic.

Hente dine tilgangsnøkler

Du trenger tilgangsnøkler for AWS S3 API hvis du ikke allerede har dem. Hvis ikke, kan du få dem ved å bla til Sikkerhetserklæringer og opprette et nytt par:

For vår kodemonstrasjon må du plassere dem i hello.ini-filen din med andre sikre nøkler og koder:

$ more /var/secure/hello.ini mysql_host = "localhost" mysql_db = "hei" mysql_un = "tom_mcfarlin" mysql_pwd = "er-aldri-gonna-give-up-rick-astley" aws_s3_access = "AXXXXXXXXXXXXXXXXXXXXXXXXXXXXA" aws_s3_secret = " nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXB "aws_s3_region =" us-east-1 "

Installere Yii Extension for AWS

For denne opplæringen bruker vi Federico Motta's AWS-utvidelse for Yii2. Han er definitivt den yngste Yii-programmereren hvis kode jeg har brukt til en Envato Tuts + opplæring:

Er det ikke utrolig hvor raskt barna plukker opp programmering disse dager?

Her er installasjonsprosessen med komponist:

$ komponent krever fedemotta / yii2-aws-sdk Bruke versjon ^ 2.0 for fedemotta / yii2-aws-sdk ./composer.json har blitt oppdatert Laster kompositorbeholdninger med pakkeinformasjon Oppdatere avhengigheter (inkludert krav-dev) ... - Installere aws / aws -dk-php (3.18.27) Nedlasting: 100% - Installering fedemotta / yii2-aws-sdk (v2.0) Laster fra cache aws / aws-sdk-php foreslår installering av aws / aws-php-sns-message-validator (For å validere innkommende SNS-varsler) foreslår aws / aws-sdk-php installering av doktrin / cache (for å bruke DoctrineCacheAdapter) Skrive låsfil Generere autoload-filer

Etterpå installerte jeg også de to bibliotekene det antyder, men installerte ikke alle neste forslag til min lokale utviklingsmaskin:

$ komponent krever aws / aws-php-sns-message-validator Bruke versjon ^ 1.1 for aws / aws-php-sns-message-validator ./composer.json har blitt oppdatert Laster inn kompositorbeholdninger med pakkeinformasjon Oppdatere avhengigheter (inkludert krav- dev) - Installere aws / aws-php-sns-message-validator (1.1.0) Laster fra cache Skrive låsfil Generere autoload-filer $ komponent krever cache / doktrinadapter Bruk versjon ^ 0.5.0 for cache / doktrinadapter. /composer.json har blitt oppdatert Laster inn kompositorbeholdninger med pakkeinformasjon Oppdatere avhengigheter (inkludert krav-dev) - Installere doktrin / cache (v1.6.0) Laster fra cache - Installere psr / cache (1.0.0) Laster fra cache - Installere cache / taggable-cache (0.4.0) Laster fra cache - Installerer fv / logg (1.0.0) Laster fra cache - Installerer cache / adapter-common (0.3.2) Laster fra cache - Installerer cache / doktrin-adapter (0.5. 0) Lasting fra bufferbuffer / doktrinadapter foreslår installering av ext-apc (Tillater for caching med Apache) cache / doktrin-adapter antyder installering av ekstern memcache (Tillater caching med Memcache) cache / doktrinadapter foreslår installering av ekstramemcached (Tillater for caching med Memcached) cache / doktrinadapter foreslår installering av extredis (Tillater caching med Redis) Skrive låsfil Generere autoload-filer

Jeg har også registrert awssdk komponent innen hei / config / web.php:

'ingredients' => ['class' => 'fedemotta \ awssdk \ AwsSdk', 'credentials' => [// du kan bruke en annen metode for å gi tilgang 'key' => $ config [ 'aws_s3_access'], 'secret' => $ config ['aws_s3_secret'],], 'region' => $ config ['aws_s3_region'], // ie: 'us-east-1' version '=>' siste ', // dvs.:' siste '], 

Bla gjennom Mine S3-kataloger

For dagens demonstrasjon opprettet jeg en hei / kontroller / StorageController.php med handlingsmetoder for å kjøre hvert eksempel, for eksempel http: // localhost: 8888 / hei / lagring / bla for å bla kataloger. 

Disse metodene kalles igjen Storage.php-modellen jeg opprettet med egne metoder.

Her er kontrollerkoden:

offentlig funksjon actionBrowse () $ s = new Storage (); $ S-> bla ( 'jeff-reifman-wp', "manuelt"); 

Den ber om at lagringsmodellen kommer opp til skyene i "S3ky" og bla gjennom den manuelle katalogen.

Hver gang Storage.php-modellen blir instantiated, laster den AWS SDK-utvidelsen og oppretter en S3-forekomst:

aws = Yii :: $ app-> awssdk-> getAwsSdk (); $ this-> s3 = $ this-> aws-> createS3 (); 

I mitt bla gjennom eksempel ekko jeg bare katalogene og filene, men du kan gjerne tilpasse denne koden som du trenger:

($ bucket = ", $ prefix =") $ result = $ this-> s3-> listObjects (['Bucket' => $ bucket, 'Prefix' => $ prefix]) -> toArray ; foreach ($ resultat som $ r) if (is_array ($ r)) hvis (array_key_exists ('statusCode', $ r)) echo 'Effektiv URL:'. $ r ['effectiveUri']. '
'; else foreach ($ r som $ item) echo $ item ['Key']. '
'; annet echo $ r. '
';

Her er resultatene når jeg surfer til http: // localhost: 8888 / hei / lagring / bla:

Laster opp filer

For å laste opp en fil må du angi den lokale banen og den fjerntliggende destinasjonstasten. Her er kontrollerkoden for opplasting:

offentlig funksjon actionUpload () $ bucket = 'jeff-reifman-wp'; $ keyname = '/manual/upload.txt'; $ filepath = '/ Brukere / Jeff / Sites / hei / upload.txt'; $ s = ny lagring (); $ result = $ s-> upload ($ bucket, $ keyname, $ filepath); ekko $ resultat ['ObjectURL']; 

Og her er lagringsmodellmetoden:

offentlig funksjonsopplasting ($ bucket, $ keyname, $ filepath) $ result = $ this-> s3-> putObject (array ('Bucket' => $ bucket, 'Key' => $ keyname, 'SourceFile' => $ filadresse, 'ContentType' => 'tekst / vanlig', 'ACL' => 'offentlig les', 'StorageClass' => 'REDUCED_REDUNDANCY', 'Metadata' => array ('param1' => 'verdi 1' 'param2' => 'verdi 2'))); returnere $ resultat;

Bla gjennom til http: // localhost: 8888 / hei / lagring / opplastning viser returadressen som jeg kan se den opplastede filen fordi jeg angav offentlig lestei min kode ovenfor:

I sin tur viser nettleseren til S3-adressen ovenfor innholdet i den opplastede filen:

Dette er en test for å laste opp til S3

Nedlasting av filer

Her er kontrollerkoden for nedlasting av en fil:

offentlig funksjon actionDownload () $ s = new Storage (); $ f = $ s-> nedlasting ('jeff-reifman-wp', 'filer / 2013/01 / i103-wedding-cover.jpg'); // Last ned filoverskriften ('Content-Type:'. $ f ['ContentType']); ekko $ f ['kropp']; 

Siden nettleseren svarer på innholdstypen, bør den vise det riktige bildet, som jeg ber om her.

Merk: Jeg laster ned et coverbilde fra min erfaring med å gifte seg med et selskap som heter Corporate Person til en kvinne (ja, det skjedde faktisk). Ekteskapet trente ikke ut på lang sikt.

Her er lagermodellkoden for nedlasting:

offentlig funksjon nedlasting ($ bucket = ", $ key =") // få det siste objektet fra s3 // $ object = end ($ result ['Contents']); // $ key = $ object ['Key']; $ file = $ this-> s3-> getObject (['Bucket' => $ bucket, 'Key' => $ key,]); returner $ file; // lagre det på disken

Her er hva du ser når filen blir streamet til nettleseren, det er bruden som feirer ved å vifte den faktiske ekteskapslisensen til Corporate Person (jeg smiler i bakgrunnen, oppdraget oppnådd).

Sikkert, du kan like lett lagre resultatene på serveren din i en fil. Det er opp til deg. Jeg oppfordrer deg til å leke med koden og tilpasse den etter behov.

Hva blir det neste?

Jeg håper dette hjelper deg med det grunnleggende ved å bruke AWS S3 fra Yii-applikasjonen. 

Hvis du liker konseptet med skybasert objekt og fillagring, men vil finne andre leverandører, sjekk ut alternativer til Amazon AWS. Jeg har gradvis flyttet fra AWS for en rekke grunner nevnt i artikkelen. En av mine neste oppgaver er å migrere mine S3-objekter som fortsatt delvis er i bruk til min egen server, som jeg kan speile med KeyCDN.

Se etter kommende opplæringsprogrammer i Programmering med Yii2-serien når vi fortsetter å dykke inn i ulike aspekter av rammen. Du vil kanskje også sjekke ut vårt Bygg din oppstart med PHP-serien, som bruker Yii2s avanserte mal når vi bygger en applikasjon i verden. Møter Planner-programmet i oppstartsserien er nå klar for bruk, og det er alt bygget i Yii.

Hvis du vil vite når neste Yii2 opplæring kommer, følg meg @ reifman på Twitter eller sjekk min instruktørside. 

Relaterte linker

  • Amazon Simple Storage Service Documentation
  • Alternativer til Amazon AWS (Envato Tuts +)
  • Yii2 Developer Exchange, min Yii2 ressurs side
  • Laster opp filer - Den Definitive Guide to Yii 2.0