Als je vraagt: "Wat is Yii?" bekijk mijn eerdere tutorial, Introductie tot het Yii Framework, die de voordelen van Yii bekijkt en een overzicht bevat van wat er nieuw is in Yii 2.0, uitgebracht in oktober 2014.
In deze serie Programming With Yii2 begeleid ik lezers in gebruik van het Yii2 Framework voor PHP. In de tutorial van vandaag zal ik je helpen bij het doorbladeren, uploaden en downloaden van bestanden van en naar de cloudgebaseerde S3-opslagservice van Amazon. In wezen heb ik een eenvoudig opslagmodel en een controller gemaakt als voorbeelden die u kunt uitbreiden voor uw behoeften.
Ter herinnering, ik neem wel deel aan de commentaarthreads hieronder. Ik ben vooral geïnteresseerd in verschillende benaderingen, aanvullende ideeën of onderwerpen voor toekomstige zelfstudies. Als u een vraag of een suggestie voor een onderwerp heeft, kunt u hieronder berichten plaatsen. Je kunt me ook rechtstreeks op Twitter @reifman bereiken.
Amazon S3 biedt eenvoudig te gebruiken, geavanceerde cloudgebaseerde opslag voor objecten en bestanden. Het biedt 99,99% beschikbaarheid en 99,9999999999% duurzaamheid van objecten.
Het biedt een verscheidenheid aan functies voor eenvoudig of geavanceerd gebruik. Het wordt vaak gebruikt als de opslagcomponent voor Amazon's CDN-service CloudFront, maar deze zijn verschillend en kunnen onafhankelijk van elkaar worden gebruikt.
U kunt S3 ook gebruiken om bestanden in de loop van de tijd te migreren naar een archief in Amazon Glacier, voor extra kostenbesparingen.
Zoals de meeste andere AWS, bedien je S3 via API's en vandaag ga ik je door het bladeren, uploaden en downloaden van bestanden van S3 met Yii.
Als u de demonstratiecode wilt uitvoeren, hebt u uw eigen Amazon AWS-account en toegangssleutels nodig. U kunt door uw S3-structuur bladeren vanuit de hieronder getoonde AWS-console:
S3 bestaat uit buckets met daarin meerdere mappen en bestanden. Omdat ik AWS als CDN gebruikte, bleef mijn WordPress-tree in mijn oude bucket. Je kunt ook door je bucket bladeren:
Terwijl ik door de structuur van objecten loop, zie ik een diepere weergave van mijn inhoud:
Nogmaals, ik zal voortbouwen op de hallo-boom van GitHub voor onze demonstratiecode (zie de link op deze pagina.) Het is afgeleid van Yii2 basic.
U hebt toegangssleutels nodig voor de AWS S3 API als u deze nog niet hebt. Als dat niet het geval is, kunt u deze verkrijgen door naar beveiligingsreferenties te bladeren en een nieuw paar te maken:
Voor onze codedemonstratie moet je ze in je hello.ini-bestand plaatsen met andere veilige sleutels en codes:
$ more /var/secure/hello.ini mysql_host = "localhost" mysql_db = "hallo" mysql_un = "tom_mcfarlin" mysql_pwd = "is-never-gonna-give-up-rick-astley" aws_s3_access = "AXXXXXXXXXXXXXXXXXXXXXXXXXXXA" aws_s3_secret = " nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXb "aws_s3_region =" us-east-1 "
Voor deze zelfstudie gebruiken we de AWS-extensie Federico Motta voor Yii2. Hij is absoluut de jongste Yii-programmeur wiens code ik heb gebruikt voor een Envato Tuts + tutorial:
Is het niet verbazingwekkend hoe snel kinderen tegenwoordig bezig zijn met programmeren??
Dit is het installatieproces met behulp van composer:
$ composer vereist fedemotta / yii2-aws-sdk De versie ^ 2.0 gebruiken voor fedemotta / yii2-aws-sdk./composer.json is bijgewerkt. Loading compository repositories met pakketinformatie Afhankelijkheden bijwerken (inclusief require-dev) ... - Installeren van aws / aws -sdk-php (3.18.27) Downloaden: 100% - Fedemotta / yii2-aws-sdk installeren (v2.0) Laden vanuit cache aws / aws-sdk-php suggereert het installeren van aws / aws-php-sns-message-validator (Om binnenkomende SNS-notificaties te valideren) aws / aws-sdk-php suggereert doctrine / cache te installeren (om de DoctrineCacheAdapter te gebruiken) Schrijfslotbestand Autoload-bestanden genereren
Daarna heb ik ook de twee bibliotheken geïnstalleerd die het suggereert, maar heb ik niet al het volgende niveau van suggesties voor mijn lokale ontwikkelingsmachine geïnstalleerd:
$ composer vereist aws / aws-php-sns-message-validator Het gebruik van versie ^ 1.1 voor aws / aws-php-sns-message-validator ./composer.json is bijgewerkt Het laden van composer-repositories met pakketinformatie Het updaten van afhankelijkheden (inclusief requirements- dev) - Installeren van aws / aws-php-sns-message-validator (1.1.0) Laden vanuit cache Schrijven lock-bestand Autoload-bestanden genereren $ composer vereist cache / doctrine-adapter Gebruik van versie ^ 0.5.0 voor cache / doctrine-adapter. /composer.json is bijgewerkt Bezig met laden van composer-repositories met pakketinformatie Afhankelijkheden bijwerken (inclusief require-dev) - Doctrine / cache installeren (v1.6.0) Bezig met laden van cache - Installeren van psr / cache (1.0.0) Laden vanuit cache - Cache installeren / taggable-cache (0.4.0) Bezig met laden van cache - Installeren van psr / log (1.0.0) Bezig met laden van cache - Installeren van cache / adapter-gemeenschappelijk (0.3.2) Bezig met laden van cache - Installeren van cache / doctrine-adapter (0.5. 0) Laden vanuit cache cache / doctrine-adapter suggereert het installeren van ext-apc (maakt caching mogelijk met Apc) cache / doctrine-adapter stelt voor om ext-memcache te installeren (cachegeheugen met Memcache mogelijk) cache / doctrine-adapter suggereert installatie van ext-memcached (toestaat voor caching met Memcached) cache / doctrine-adapter suggereert ext-redis te installeren (maakt caching mogelijk met Redis) Schrijfslotbestand Autoload-bestanden genereren
Ik heb ook het awssdk
component binnen hello / config / web.php:
'components' => ['awssdk' => ['class' => 'fedemotta \ awssdk \ AwsSdk', 'credentials' => [// je kunt een andere methode gebruiken om toegang toe te staan 'key' => $ config [ 'aws_s3_access'], 'secret' => $ config ['aws_s3_secret'],], 'region' => $ config ['aws_s3_region'], // ie: 'us-east-1 "version' => 'laatste ', // ie:' laatste '],
Voor de demonstratie van vandaag heb ik een hello / controllers / StorageController.php gemaakt met actiemethoden om elk voorbeeld uit te voeren, zoals http: // localhost: 8888 / hallo / storage / browse om door mappen te bladeren.
Deze methoden noemen op hun beurt het Storage.php-model dat ik met hun eigen methoden heb gemaakt.
Hier is de controllercode:
public function actionBrowse () $ s = nieuwe opslag (); $ S-> bladeren ( 'jeff-reifman-wp', "manual");
Het vraagt dat het opslagmodel de wolken bereikt in de "S3ky" en bladert door de handmatige map.
Telkens wanneer het Storage.php-model wordt geïnstantieerd, wordt de AWS SDK-extensie geladen en wordt een S3-instantie gemaakt:
aws = Yii :: $ app-> awssdk-> getAwsSdk (); $ this-> s3 = $ this-> aws-> createS3 ();
In mijn voorbeeld browse ik gewoon de mappen en bestanden, maar je kunt deze code naar eigen wens aanpassen:
openbare functie bladeren ($ bucket = ", $ prefix =") $ result = $ this-> s3-> listObjects (['Bucket' => $ bucket, "Prefix" => $ prefix]) -> toArray () ; foreach ($ resultaat als $ r) if (is_array ($ r)) if (array_key_exists ('statusCode', $ r)) echo 'Effectieve URL:'. $ r ['effectiveUri']. '
'; else foreach ($ r als $ item) echo $ item ['Key']. '
'; else echo $ r. '
';
Dit zijn de resultaten wanneer ik blader naar http: // localhost: 8888 / hallo / storage / browse:
Als u een bestand wilt uploaden, moet u het lokale pad en de externe bestemmingssleutel opgeven. Dit is de controllercode voor uploaden:
public function actionUpload () $ bucket = 'jeff-reifman-wp'; $ keyname = '/manual/upload.txt'; $ filepath = '/ Users / Jeff / Sites / hello / upload.txt'; $ s = nieuwe opslag (); $ result = $ s-> upload ($ bucket, $ keyname, $ filepath); echo $ result ['ObjectURL'];
En hier is de methode van het opslagmodel:
public function upload ($ 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' => 'waarde 1', 'param2' => 'waarde 2'))); return $ resultaat;
Bladeren naar http: // localhost: 8888 / hallo / opslag / upload geeft de terugkerende URL weer van waaruit ik het geüploade bestand kan bekijken, omdat ik heb opgegeven public-read
in mijn code hierboven:
Het bladeren naar het S3-adres hierboven toont op zijn beurt de inhoud van het geüploade bestand:
Dit is een test om te uploaden naar S3
Hier is de controllercode voor het downloaden van een bestand:
public function actionDownload () $ s = nieuwe opslag (); $ f = $ s-> download ('jeff-reifman-wp', 'files / 2013/01 / i103-wedding-cover.jpg'); // download de bestandskop ('Content-type:'. $ f ['ContentType']); echo $ f ['Body'];
Aangezien de browser reageert op het inhoudstype, moet deze de juiste afbeelding weergeven, die ik hier verzoek.
Notitie: Ik download een coverafbeelding van mijn ervaring door met een bedrijf met de naam Corporate Person te trouwen met een vrouw (ja, het is echt gebeurd). Het huwelijk verliep niet op de lange termijn.
Dit is de code voor het opslagmodel om te downloaden:
public function download ($ bucket = ", $ key =") // haal het laatste object uit s3 // $ object = end ($ result ['Contents']); // $ key = $ object ['Key']; $ file = $ this-> s3-> getObject (['Bucket' => $ bucket, 'Key' => $ key,]); return $ bestand; // sla het op naar een schijf
Dit is wat je ziet wanneer het bestand naar de browser wordt gestreamd - dat is de bruid die viert door de eigenlijke huwelijkslicentie te zwaaien met de persoon van het bedrijf (ik lach op de achtergrond, missie volbracht).
Zeker, u zou net zo gemakkelijk de resultaten op uw server in een bestand kunnen opslaan. Het is aan jou. Ik moedig je aan om met de code te spelen en deze naar wens aan te passen.
Ik hoop dat dit je helpt bij het gebruik van AWS S3 vanuit je Yii-applicatie.
Als je van het concept van cloudgebaseerde object- en bestandsopslag houdt maar andere aanbieders wilt vinden, bekijk dan Alternatieven voor Amazon AWS. Ik ben geleidelijk van AWS afgestapt om een aantal redenen die in het artikel worden genoemd. Een van mijn volgende taken is om mijn S3-objecten die nog gedeeltelijk in gebruik zijn te migreren naar mijn eigen server, die ik kan spiegelen met KeyCDN.
Bekijk de komende tutorials in onze Programming With Yii2-serie terwijl we doorgaan met duiken in verschillende aspecten van het framework. Je kunt ook onze Building Your Startup With PHP-serie bekijken, die de geavanceerde template van Yii2 gebruikt terwijl we een real-world applicatie bouwen. De Meeting Planner-toepassing in de opstartreeks is nu klaar voor gebruik en het is allemaal ingebouwd in Yii.
Als je wilt weten wanneer de volgende Yii2-tutorial aankomt, volg me dan @reifman op Twitter of bekijk mijn instructeurpagina.