Programmation avec Yii2 Utilisation d'Amazon S3

Ce que vous allez créer

Si vous demandez, "Qu'est-ce que Yii?" consultez mon tutoriel précédent, Introduction au framework Yii, qui passe en revue les avantages de Yii et inclut un aperçu des nouveautés de Yii 2.0, publiées en octobre 2014.

Dans cette série de programmation avec Yii2, je guide les lecteurs dans l'utilisation du framework Yii2 pour PHP. Dans le tutoriel d'aujourd'hui, je vais vous expliquer les bases de la navigation, du téléchargement et du téléchargement de fichiers vers et depuis le service de stockage S3 basé sur le cloud d'Amazon. Pour l'essentiel, j'ai créé un modèle de stockage simple et un contrôleur, à titre d'exemples, que vous pouvez étendre selon vos besoins..

Juste un rappel, je participe aux commentaires ci-dessous. Je suis particulièrement intéressé si vous avez des approches différentes, des idées supplémentaires ou si vous souhaitez suggérer des sujets pour de futurs tutoriels. Si vous avez une question ou une suggestion de sujet, veuillez poster ci-dessous. Vous pouvez également me joindre directement sur Twitter @reifman.

Qu'est-ce qu'Amazon S3??

Amazon S3 fournit un stockage en nuage avancé et facile à utiliser pour les objets et les fichiers. Il offre une disponibilité de 99,99% et une durabilité de 99,999999999% des objets.

Il offre une variété de fonctionnalités pour une utilisation simple ou avancée. Il est couramment utilisé comme composant de stockage pour le service CDN d'Amazon CloudFront, mais ils sont distincts et peuvent être utilisés indépendamment les uns des autres..

Vous pouvez également utiliser S3 pour migrer au fil du temps des fichiers à archiver dans Amazon Glacier, pour des économies de coûts supplémentaires..

Comme la plupart des AWS, vous utilisez S3 via des API. Aujourd'hui, je vais vous guider dans la navigation, le téléchargement et le téléchargement de fichiers de S3 avec Yii..

Commencer

Pour exécuter le code de démonstration, vous aurez besoin de votre propre compte Amazon AWS et de vos clés d'accès. Vous pouvez parcourir votre arborescence S3 à partir de la console AWS illustrée ci-dessous:

S3 est constitué de compartiments contenant de nombreux répertoires et fichiers. Depuis que j'utilise AWS en tant que CDN, mon arbre WordPress reste dans mon ancien seau. Vous pouvez également parcourir votre seau:

Lorsque je traverse l’arbre des objets, voici une vue plus détaillée du contenu de mon seau:

Programmation avec S3

Encore une fois, je construirai sur l'arbre hello de GitHub pour notre code de démonstration (voir le lien sur cette page.) Il est dérivé de Yii2 basic.

Obtenir vos clés d'accès

Vous aurez besoin de clés d'accès pour l'API AWS S3 si vous ne les avez pas déjà. Sinon, vous pouvez les obtenir en allant sur Informations d'identification de sécurité et en créant une nouvelle paire:

Pour notre démonstration de code, vous devrez les placer dans votre fichier hello.ini avec d’autres clés et codes sécurisés:

$ more /var/secure/hello.ini mysql_host = "localhost" mysql_db = "bonjour" mysql_un = "tom_mcfarlin" mysql_pwd = nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXb "aws_s3_region =" us-east-1 "

Installation de l'extension Yii pour AWS

Pour ce tutoriel, nous utiliserons l'extension AWS de Federico Motta pour Yii2. Il est certainement le plus jeune programmeur Yii dont j'ai utilisé le code pour un tutoriel Envato Tuts +:

N'est-il pas étonnant de voir à quelle vitesse les enfants choisissent la programmation ces jours-ci?

Voici le processus d'installation à l'aide de composer:

$ composer require fedemotta / yii2-aws-sdk Utilisation de la version ^ 2.0 pour fedemotta / yii2-aws-sdk ./composer.json a été mis à jour Chargement des référentiels de compositeur avec les informations de paquet Mise à jour des dépendances (y compris require-dev)… - Installation de aws / aws -sdk-php (3.18.27) Téléchargement: 100% - Installation de fedemotta / yii2-aws-sdk (v2.0) Chargement depuis le cache aws / aws-sdk-php suggère d'installer aws / aws-php-sns-message-validator (Pour valider les notifications SNS entrantes) aws / aws-sdk-php suggère d'installer doctrine / cache (Pour utiliser DoctrineCacheAdapter) Écriture d'un fichier verrou Génération de fichiers à chargement automatique

Par la suite, j'ai également installé les deux bibliothèques suggérées, mais sans installer toutes les suggestions de niveau supérieur pour ma machine de développement local:

$ composer composer aws / aws-php-sns-message-validator Utiliser la version ^ 1.1 pour aws / aws-php-sns-message-validator ./composer.json a été mis à jour Chargement des référentiels du compositeur avec les informations de paquetage dev) - Installation de aws / aws-php-sns-message-validator (1.1.0) Chargement à partir du cache Écriture d'un fichier de verrouillage La création de fichiers à chargement automatique $ composer nécessite cache / doctrine-adapter Utilisation de la version ^ 0.5.0 pour cache / doctrine-adapter. Mise à jour du fichier /composer.json Chargement des référentiels Composer avec les informations de paquet Mise à jour des dépendances (y compris require-dev) - Installation de doctrine / cache (v1.6.0) Chargement à partir du cache - Installation de psr / cache (1.0.0) Chargement à partir du cache - Installation du cache / taggable-cache (0.4.0) Chargement depuis le cache - Installation de psr / log (1.0.0) Chargement depuis le cache - Installation du cache / adapter-common (0.3.2) Chargement depuis le cache - Installation du cache / doctrine-adapter (0.5. 0) Le chargement depuis le cache cache / doctrine-adapter suggère d’installer ext-apc (Permet de mettre en cache avec Apc) cache / doctrine-adapter suggère d'installer ext-memcache (permet la mise en cache avec Memcache) cache / doctrine-adapter suggère d'installer ext-memcached (permet la mise en cache avec Memcached) cache / doctrine-adapter suggère d'installer ext-redis (permet la mise en cache avec Redis) Écrire un fichier de verrouillage Générer des fichiers à chargement automatique

J'ai aussi enregistré le awssdk composant dans hello / config / web.php:

'components' => ['awssdk' => ['class' => 'fedemotta \ awssdk \ AwsSdk', 'credentials' => [// vous pouvez utiliser une méthode différente pour accorder l'accès 'key' => $ config [ 'aws_s3_access'], 'secret' => $ config ['aws_s3_secret'],], 'region' => $ config ['aws_s3_region'], // ie: 'us-east-1 "version" => "dernière ', // ie:' dernier '], 

Parcourir mes répertoires S3

Pour la démonstration d'aujourd'hui, j'ai créé hello / controllers / StorageController.php avec des méthodes d'action permettant d'exécuter chaque exemple, tel que http: // localhost: 8888 / hello / storage / parcourir les répertoires de navigation.. 

Ces méthodes appellent à leur tour le modèle Storage.php que j'ai créé avec leurs propres méthodes..

Voici le code du contrôleur:

fonction publique actionBrowse () $ s = new Storage (); $ s-> parcourir ('jeff-reifman-wp', "manuel"); 

Il demande que le modèle de stockage atteigne les nuages ​​dans le "S3ky" et parcoure le répertoire manuel.

Chaque fois que le modèle Storage.php est instancié, il charge l'extension AWS SDK et crée une instance S3:

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

Dans mon exemple de navigation, je répète simplement les répertoires et les fichiers, mais vous pouvez personnaliser ce code selon vos besoins:

fonction publique parcourir ($ bucket = ", $ prefix =") $ result = $ this-> s3-> listObjects (['Bucket' => $ bucket, "Prefix" => $ prefix]) -> toArray () ; foreach ($ result as $ r) if (is_array ($ r)) if (array_key_exists ('statusCode', $ r)) echo 'URL effective:'. $ r ['effectiveUri']. '
'; else foreach ($ r en tant que $ item) echo $ item ['Key']. '
'; else echo $ r. '
';

Voici les résultats lorsque je navigue sur http: // localhost: 8888 / hello / storage / browse:

Téléchargement de fichiers

Pour télécharger un fichier, vous devez spécifier le chemin local et la clé de destination distante. Voici le code du contrôleur pour le téléchargement:

fonction publique actionUpload () $ bucket = 'jeff-reifman-wp'; $ keyname = '/manual/upload.txt'; $ filepath = '/ Utilisateurs / Jeff / Sites / Bonjour / upload.txt'; $ s = nouveau stockage (); $ result = $ s-> upload ($ bucket, $ keyname, $ filepath); echo $ result ['ObjectURL']; 

Et voici la méthode du modèle de stockage:

fonction publique uploadée ($ bucket, $ keyname, $ filepath) $ result = $ this-> s3-> putObject (array ('Bucket' => $ bucket, 'Key' => $ keyname, 'SourceFile' => $ filepath, 'ContentType' => 'text / plain', 'ACL' => 'public-read', 'StorageClass' => 'REDUCED_REDUNDANCY', 'Metadata' => tableau ('param1' => 'valeur 1', 'param2' => 'valeur 2'))); return $ result;

La navigation sur http: // localhost: 8888 / hello / storage / upload affiche l'URL de renvoi à partir de laquelle je peux afficher le fichier téléchargé, car j'ai spécifié lecture publiquedans mon code ci-dessus:

En accédant à l'adresse S3 ci-dessus, vous verrez le contenu du fichier téléchargé:

Ceci est un test à télécharger sur S3

Téléchargement de fichiers

Voici le code du contrôleur pour télécharger un fichier:

fonction publique actionDownload () $ s = new Storage (); $ f = $ s-> télécharger ('jeff-reifman-wp', 'files / 2013/01 / i103-wedding-cover.jpg'); // téléchargez l'en-tête du fichier ('Content-Type:'. $ f ['ContentType']); echo $ f ['Body']; 

Puisque le navigateur répond au type de contenu, il devrait afficher l'image appropriée, ce que je demande ici..

Remarque: Je télécharge une image de couverture de mon expérience d'épouser une société nommée personne morale avec une femme (oui, c'est arrivé). Le mariage n'a pas fonctionné à long terme.

Voici le code du modèle de stockage à télécharger:

fonction publique download ($ bucket = ", $ key =") // récupère le dernier objet de s3 // $ object = end ($ result ['Contents']); // $ key = $ object ['Key']; $ file = $ this-> s3-> getObject (['Bucket' => $ bucket, 'Key' => $ key,]); retourne le fichier $; // enregistrez-le sur le disque

Voici ce que vous voyez lorsque le fichier est transféré sur le navigateur - c'est la mariée qui célèbre en remettant la licence de mariage à une personne morale (je souris en arrière-plan, mission accomplie).

Certes, vous pouvez tout aussi facilement stocker les résultats sur votre serveur dans un fichier. C'est à vous. Je vous encourage à jouer avec le code et à le personnaliser selon vos besoins..

Et après?

J'espère que cela vous aidera à utiliser les bases d'AWS AWS S3 à partir de votre application Yii.. 

Si vous aimez le concept de stockage d'objets et de fichiers en nuage mais souhaitez rechercher d'autres fournisseurs, consultez Alternatives à Amazon AWS. Je m'éloigne progressivement d'AWS pour un certain nombre de raisons mentionnées dans l'article. Une de mes tâches suivantes consiste à migrer mes objets S3 encore partiellement utilisés vers mon propre serveur, que je peux mettre en miroir avec KeyCDN..

Surveillez les prochains tutoriels de notre série Programmation avec Yii2 pendant que nous continuons à plonger dans différents aspects du cadre. Vous voudrez peut-être aussi consulter notre série Construire votre démarrage avec PHP, qui utilise le modèle avancé de Yii2 pour créer une application réelle. L'application Meeting Planner de la série de démarrage est maintenant prête à être utilisée et tout est intégré à Yii..

Si vous souhaitez savoir quand le prochain tutoriel Yii2 arrive, suivez-moi @reifman sur Twitter ou consultez ma page d'instructeur.. 

Liens connexes

  • Documentation Amazon Simple Storage Service
  • Alternatives à Amazon AWS (Envato Tuts +)
  • Yii2 Developer Exchange, mon site de ressources Yii2
  • Téléchargement de fichiers - Le guide définitif de Yii 2.0