Programmazione con Yii2 utilizzo di Amazon S3

Cosa starai creando

Se stai chiedendo "Cos'è Yii?" guarda il mio tutorial precedente, Introduzione al framework Yii, che rivede i vantaggi di Yii e include una panoramica delle novità in Yii 2.0, rilasciata nell'ottobre 2014.

In questa serie di programmazione con Yii2, guido i lettori all'uso di Yii2 Framework per PHP. Nel tutorial di oggi, ti illustrerò le basi della navigazione, del caricamento e del download dei file da e verso il servizio di archiviazione S3 basato su cloud di Amazon. In sostanza, ho creato un semplice modello di archiviazione e un controller come esempi che è possibile estendere per le proprie esigenze.

Solo un promemoria, parteciperò alle discussioni dei commenti qui sotto. Sono particolarmente interessato se hai approcci diversi, idee aggiuntive o vuoi suggerire argomenti per futuri tutorial. Se hai una domanda o un suggerimento sull'argomento, per favore pubblica qui sotto. Puoi anche raggiungermi su Twitter direttamente @reifman.

Cos'è Amazon S3?

Amazon S3 offre uno storage basato su cloud avanzato di facile utilizzo per oggetti e file. Offre disponibilità del 99,99% e durata del 99,999999999% degli oggetti.

Offre una varietà di funzioni per l'utilizzo semplice o avanzato. È comunemente usato come componente di archiviazione per il servizio CDN di Amazon CloudFront, ma questi sono distinti e possono essere utilizzati indipendentemente l'uno dall'altro.

È inoltre possibile utilizzare S3 per migrare i file nel tempo per archiviarli in Amazon Glacier, per un ulteriore risparmio.

Come la maggior parte di AWS, gestisci S3 tramite API e oggi ti guiderò attraverso la navigazione, il caricamento e il download di file da S3 con Yii.

Iniziare

Per eseguire il codice dimostrativo, avrai bisogno del tuo account Amazon AWS e delle chiavi di accesso. Puoi sfogliare il tuo albero S3 dalla console AWS mostrata di seguito:

S3 è composto da bucket che contengono numerose directory e file al loro interno. Dato che usavo AWS come CDN, il mio albero WordPress rimane nel mio vecchio secchio. Puoi anche sfogliare il tuo bucket:

Mentre percorro l'albero degli oggetti, ecco una visione più approfondita del contenuto del mio secchio:

Programmazione con S3

Ancora una volta, costruirò l'albero Hello di GitHub per il nostro codice dimostrativo (vedi il link su questa pagina). È derivato da Yii2 basic.

Ottenere le chiavi di accesso

Avrai bisogno delle chiavi di accesso per l'API di AWS S3 se non le hai già. In caso contrario, è possibile ottenerli sfogliando le credenziali di sicurezza e creando una nuova coppia:

Per la nostra dimostrazione del codice, dovrai inserirli nel tuo file hello.ini con altri codici e chiavi sicure:

$ more /var/secure/hello.ini mysql_host = "localhost" mysql_db = "ciao" mysql_un = "tom_mcfarlin" mysql_pwd = "is-never-gonna-give-up-rick-astley" aws_s3_access = "AXXXXXXXXXXXXXXXXXXXXXXXXXXXA" aws_s3_secret = " nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXb "aws_s3_region =" us-east-1 "

Installazione dell'estensione Yii per AWS

Per questo tutorial, utilizzeremo l'estensione AWS di Federico Motta per Yii2. È sicuramente il più giovane programmatore di Yii il cui codice ho usato per un tutorial Envato Tuts +:

Non è sorprendente quanto velocemente i bambini stiano iniziando a programmare in questi giorni?

Ecco il processo di installazione utilizzando il compositore:

$ compositore richiede fedemotta / yii2-aws-sdk Usando la versione ^ 2.0 per fedemotta / yii2-aws-sdk ./composer.json è stato aggiornato Caricamento dei repository di compositore con informazioni sul pacchetto Aggiornamento delle dipendenze (incluso require-dev) ... - Installazione di aws / aws -sdk-php (3.18.27) Download: 100% - Installazione di fedemotta / yii2-aws-sdk (v2.0) Caricamento da cache aws / aws-sdk-php suggerisce l'installazione di aws / aws-php-sns-message-validator (Per convalidare le notifiche SNS in arrivo) aws / aws-sdk-php suggerisce di installare doctrine / cache (Per usare DoctrineCacheAdapter) Scrivere il lock file Generare i file autoload

Successivamente, ho anche installato le due librerie suggerite, ma non ho installato tutto il livello successivo di suggerimenti per la mia macchina di sviluppo locale:

$ compositore richiede aws / aws-php-sns-message-validator Usando la versione ^ 1.1 per aws / aws-php-sns-message-validator ./composer.json è stato aggiornato Caricamento dei repository di composer con informazioni sul pacchetto Aggiornamento delle dipendenze (incluso require- dev) - Installazione di aws / aws-php-sns-message-validator (1.1.0) Caricamento dalla cache Scrittura del file di blocco Generazione dei file di caricamento automatico $ compositore richiede cache / doctrine-adapter Utilizzando la versione ^ 0.5.0 per cache / doctrine-adapter. /composer.json è stato aggiornato Caricamento dei repository di composer con informazioni sul pacchetto Aggiornamento delle dipendenze (incluso require-dev) - Installazione di doctrine / cache (v1.6.0) Caricamento dalla cache - Installazione di psr / cache (1.0.0) Caricamento dalla cache - Installazione della cache / taggable-cache (0.4.0) Caricamento dalla cache - Installazione di psr / log (1.0.0) Caricamento dalla cache - Installazione della cache / adattatore-comune (0.3.2) Caricamento dalla cache - Installazione della cache / doctrine-adapter (0.5. 0) Caricamento dalla cache cache / doctrine-adapter suggerisce di installare ext-apc (Permette di memorizzare nella cache con Apc) cache / doctrine-adapter suggerisce l'installazione di ext-memcache (Permette la memorizzazione nella cache con Memcache) cache / doctrine-adapter suggerisce l'installazione di ext-memcached (Permette la memorizzazione nella cache con Memcached) cache / doctrine-adapter suggerisce l'installazione di ext-redis (Permette la memorizzazione nella cache con Redis) Scrittura del file di blocco Generazione di file di caricamento automatico

Ho anche registrato il awssdk componente in hello / config / web.php:

'components' => ['awssdk' => ['class' => 'fedemotta \ awssdk \ AwsSdk', 'credentials' => [// puoi usare un metodo diverso per concedere l'accesso 'key' => $ config [ 'aws_s3_access'], 'secret' => $ config ['aws_s3_secret'],], 'region' => $ config ['aws_s3_region'], // ie: 'us-east-1 "version' => 'latest ', // ie:' latest '], 

Sfogliare i miei elenchi S3

Per la dimostrazione di oggi, ho creato un hello / controller / StorageController.php con metodi di azione per eseguire ogni esempio, ad esempio http: // localhost: 8888 / hello / storage / browse per sfogliare le directory. 

Questi metodi a loro volta chiamano il modello di Storage.php che ho creato con i loro metodi.

Ecco il codice del controller:

funzione pubblica actionBrowse () $ s = new Storage (); $ S-> Cerca ( 'jeff-Reifman-wp', "manuale"); 

Richiede che il modello di archiviazione raggiunga i cloud in "S3ky" e sfoglia la directory manuale.

Ogni volta che viene istanziato il modello di Storage.php, carica l'estensione SDK AWS e crea un'istanza S3:

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

Nel mio esempio di navigazione, sto solo facendo eco alle directory e ai file, ma puoi tranquillamente personalizzare questo codice come ti serve:

funzione pubblica browse ($ bucket = ", $ prefix =") $ result = $ this-> s3-> listObjects (['Bucket' => $ bucket, "Prefisso" => $ prefisso]) -> toArray () ; foreach ($ result as $ r) if (is_array ($ r)) if (array_key_exists ('statusCode', $ r)) echo 'Effective URL:'. $ r ['effectiveUri']. '
'; else foreach ($ r come $ item) echo $ item ['Key']. '
'; else echo $ r. '
';

Ecco i risultati quando navigo su http: // localhost: 8888 / hello / storage / browse:

Caricamento di file

Per caricare un file, è necessario specificare il percorso locale e la chiave di destinazione remota. Ecco il codice del controller per il caricamento:

funzione pubblica actionUpload () $ bucket = 'jeff-reifman-wp'; $ keyname = '/manual/upload.txt'; $ filepath = '/ Users / Jeff / Sites / hello / upload.txt'; $ s = new Storage (); $ result = $ s-> upload ($ bucket, $ keyname, $ filepath); echo $ result ['ObjectURL']; 

Ed ecco il metodo del modello di archiviazione:

upload di funzioni pubbliche ($ bucket, $ keyname, $ filepath) $ result = $ this-> s3-> putObject (array ('Bucket' => $ bucket, 'Key' => $ keyname, 'SourceFile' => $ filepath, 'ContentType' => 'text / plain', 'ACL' => 'public-read', 'StorageClass' => 'REDUCED_REDUNDANCY', 'Metadata' => array ('param1' => 'valore 1', 'param2' => 'valore 2'))); ritorno $ risultato;

Navigando su http: // localhost: 8888 / hello / storage / upload viene visualizzato l'URL di ritorno da cui posso visualizzare il file caricato, perché ho specificato pubblico-letturanel mio codice qui sopra:

A sua volta, la navigazione verso l'indirizzo S3 sopra mostra il contenuto del file caricato:

Questo è un test da caricare su S3

Download di file

Ecco il codice del controller per il download di un file:

funzione pubblica actionDownload () $ s = new Storage (); $ f = $ s-> download ('jeff-reifman-wp', 'files / 2013/01 / i103-wedding-cover.jpg'); // scarica l'intestazione del file ('Content-Type:'. $ f ['ContentType']); echo $ f ['Body']; 

Poiché il browser risponde al tipo di contenuto, dovrebbe visualizzare l'immagine appropriata, che sto richiedendo qui.

Nota: Sto scaricando un'immagine di copertina dalla mia esperienza di matrimonio con una società denominata Persona Corporativa a una donna (sì, in realtà è successo). Il matrimonio non ha funzionato a lungo termine.

Ecco il codice del modello di archiviazione per il download:

download di una funzione pubblica ($ bucket = ", $ key =") // ottiene l'ultimo oggetto da s3 // $ object = end ($ result ['Contents']); // $ key = $ object ['Key']; $ file = $ this-> s3-> getObject (['Bucket' => $ bucket, 'Key' => $ key,]); return $ file; // salvalo su disco

Ecco cosa vedi quando il file viene trasmesso in streaming al browser: è la festeggiata della sposa che sventola l'effettiva licenza di matrimonio a Persona Corporativa (sto sorridendo in sottofondo, missione compiuta).

Certamente, è possibile memorizzare i risultati sul server in un file. Tocca a voi. Ti incoraggio a giocare con il codice e a personalizzarlo come ti serve.

Qual'è il prossimo?

Spero che questo ti aiuti con le basi per l'utilizzo di AWS S3 dalla tua applicazione Yii. 

Se ti piace il concetto di archiviazione basata su oggetti e file basati su cloud ma desideri trovare altri fornitori, consulta le alternative ad Amazon AWS. Mi sono gradualmente allontanato da AWS per una serie di ragioni menzionate nell'articolo. Uno dei miei prossimi compiti è quello di migrare i miei oggetti S3 che sono ancora in parte in uso sul mio server, che posso specchiare con KeyCDN.

Guarda le prossime esercitazioni nella nostra serie Programming With Yii2 mentre continuiamo a esplorare i diversi aspetti del framework. Potresti anche voler controllare la nostra creazione della tua startup con la serie PHP che utilizza il modello avanzato di Yii2 mentre costruiamo un'applicazione reale. L'applicazione Meeting Planner nella serie di avvio è ora pronta per l'uso ed è interamente costruita in Yii.

Se vuoi sapere quando arriverà il prossimo tutorial di Yii2, seguimi @reifman su Twitter o controlla la mia pagina di istruttore. 

Link correlati

  • Amazon Simple Storage Service Documentation
  • Alternative ad Amazon AWS (Envato Tuts +)
  • Yii2 Developer Exchange, il mio sito di risorse Yii2
  • Uploading Files-The Definitive Guide to Yii 2.0