Si estás preguntando, "¿Qué es Yii?" echa un vistazo a mi tutorial anterior, Introducción al marco Yii, que revisa los beneficios de Yii e incluye una descripción general de las novedades de Yii 2.0, lanzada en octubre de 2014.
En esta serie de Programación con Yii2, guío a los lectores en el uso del Marco de trabajo de Yii2 para PHP. En el tutorial de hoy, lo guiaré a través de los conceptos básicos de navegación, carga y descarga de archivos desde y hacia el servicio de almacenamiento S3 basado en la nube de Amazon. Esencialmente, he creado un modelo de almacenamiento y un controlador simples como ejemplos que puede ampliar para sus necesidades.
Solo un recordatorio, participo en los hilos de comentarios a continuación. Estoy especialmente interesado si tiene diferentes enfoques, ideas adicionales o si desea sugerir temas para futuros tutoriales. Si tiene alguna pregunta o sugerencia de tema, por favor publique a continuación. También puedes contactarme en Twitter @reifman directamente.
Amazon S3 proporciona almacenamiento avanzado y fácil de usar basado en la nube para objetos y archivos. Ofrece 99.99% de disponibilidad y 99.999999999% de durabilidad de los objetos..
Ofrece una variedad de características para uso simple o avanzado. Se usa comúnmente como el componente de almacenamiento para el servicio de CDN de Amazon CloudFront, pero son distintos y se pueden usar de forma independiente..
También puede usar S3 para migrar archivos a lo largo del tiempo para archivar en Amazon Glacier, para ahorros de costos adicionales.
Como la mayoría de todos los AWS, usted opera S3 a través de las API, y hoy, lo guiaré a través de la navegación, carga y descarga de archivos desde S3 con Yii.
Para ejecutar el código de demostración, necesitará su propia cuenta de Amazon AWS y claves de acceso. Puede navegar por su árbol S3 desde la consola de AWS que se muestra a continuación:
S3 consiste en cubos que contienen numerosos directorios y archivos dentro de ellos. Como solía usar AWS como CDN, mi árbol de WordPress permanece en mi antiguo depósito. También puedes navegar tu balde:
Mientras atravieso el árbol de objetos, aquí hay una vista más profunda de los contenidos de mi cubo:
Nuevamente, construiré el árbol de saludo de GitHub para nuestro código de demostración (vea el enlace en esta página). Se deriva de Yii2 basic.
Necesitará claves de acceso para la API de AWS S3 si aún no las tiene. De lo contrario, puede obtenerlos al buscar Credenciales de seguridad y crear un nuevo par:
Para nuestra demostración de código, deberá colocarlos en su archivo hello.ini con otras claves y códigos seguros:
$ more /var/secure/hello.ini mysql_host = "localhost" mysql_db = "hola" mysql_un = "tom_mcfarlin" mysql_pwings = "repasos" "" "" "" "" "" "" "" "" nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXb "aws_s3_region =" us-east-1 "
Para este tutorial, usaremos la extensión AWS de Federico Motta para Yii2. Definitivamente es el programador de Yii más joven cuyo código he usado para un tutorial de Envato Tuts +:
¿No es asombroso lo rápido que los niños están aprendiendo a programar en estos días??
Aquí está el proceso de instalación usando compositor:
$ composer require fedemotta / yii2-aws-sdk Se ha actualizado la utilización de la versión ^ 2.0 para fedemotta / yii2-aws-sdk ./composer.json Cargando repositorios de compositor con información del paquete Actualizaciones de dependencias (incluido require-dev) ... -sdk-php (3.18.27) Descarga: 100% - La instalación de fedemotta / yii2-aws-sdk (v2.0) Cargando desde la caché aws / aws-sdk-php sugiere la instalación de aws / aws-php-sns-message-validator (Para validar las notificaciones SNS entrantes) aws / aws-sdk-php sugiere instalar doctrine / cache (Para usar el DoctrineCacheAdapter) Escribir un archivo de bloqueo Generar archivos de carga automática
Después, también instalé las dos bibliotecas que sugiere, pero no instalé todas las siguientes sugerencias de nivel para mi máquina de desarrollo local:
$ composer require aws / aws-php-sns-message-validator El uso de la versión ^ 1.1 para aws / aws-php-sns-message-validator ./composer.json se ha actualizado. Carga de repositorios de compositor con información del paquete. Dependencias de actualización (incluido dev) - Instalar aws / aws-php-sns-message-validator (1.1.0) Cargar desde la memoria caché Escribir archivo de bloqueo Generar archivos de carga automática $ composer requiere caché / doctrine-adapter Uso de la versión ^ 0.5.0 para caché / doctrine-adapter. /composer.json ha sido actualizado. Cargando repositorios de compositores con información del paquete Actualizando dependencias (incluyendo require-dev) - Instalando doctrine / cache (v1.6.0) Cargando desde cache - Instalando psr / cache (1.0.0) Cargando desde cache - Instalando cache / taggable-cache (0.4.0) Cargar desde el caché - Instalar psr / log (1.0.0) Cargar desde el caché - Instalar cache / adapter-common (0.3.2) Cargar desde el caché - Instalar cache / doctrine-adapter (0.5. 0) La carga desde el caché / doctrine-adapter de caché sugiere instalar ext-apc (permite el almacenamiento en caché con Apc) caché / doctrine-adapter sugiere instalar ext-memcache (permite el almacenamiento en caché con Memcache) caché / doctrine-adapter sugiere instalar ext-memcached (permite el almacenamiento en caché con Memcached) caché / doctrine-adapter sugiere instalar ext-redis (permite el almacenamiento en caché con Redis) Escribiendo archivo de bloqueo Generando archivos de carga automática
También registré el awssdk
componente dentro de hello / config / web.php:
'components' => ['awssdk' => ['class' => 'fedemotta \ awssdk \ AwsSdk', 'credentials' => [// puede usar un método diferente para otorgar acceso 'key' => $ config [ 'aws_s3_access'], 'secret' => $ config ['aws_s3_secret'],], 'region' => $ config ['aws_s3_region'], // ie: 'us-east-1 "version' => 'más reciente ', // ie:' último '],
Para la demostración de hoy, creé un hello / controllers / StorageController.php con métodos de acción para ejecutar cada ejemplo, como http: // localhost: 8888 / hello / storage / browse para examinar directorios.
Estos métodos a su vez llaman al modelo Storage.php que he creado con sus propios métodos..
Aquí está el código del controlador:
función pública actionBrowse () $ s = new Storage (); $ s-> browse ('jeff-reifman-wp', "manual");
Solicita que el modelo de Almacenamiento alcance las nubes en el "S3ky" y busque el directorio manual..
Cada vez que se crea una instancia del modelo Storage.php, se carga la extensión del SDK de AWS y se crea una instancia de S3:
aws = Yii :: $ app-> awssdk-> getAwsSdk (); $ this-> s3 = $ this-> aws-> createS3 ();
En mi ejemplo de navegación, me estoy haciendo eco de los directorios y archivos, pero puede sentirse libre de personalizar este código cuando lo necesite:
función pública browse ($ 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 efectiva:'. $ r ['EffectiveUri']. '
'; else foreach ($ r como $ item) echo $ item ['Key']. '
'; else else echo $ r. '
';
Aquí están los resultados cuando navego a http: // localhost: 8888 / hello / storage / browse:
Para cargar un archivo, debe especificar la ruta local y la clave de destino remota. Aquí está el código del controlador para subir:
función pública actionUpload () $ bucket = 'jeff-reifman-wp'; $ keyname = '/manual/upload.txt'; $ filepath = '/ Users / Jeff / Sites / hello / upload.txt'; $ s = nuevo almacenamiento (); $ result = $ s-> upload ($ bucket, $ keyname, $ filepath); echo $ result ['ObjectURL'];
Y aquí está el método del modelo de almacenamiento:
carga pública de funciones ($ 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' => 'value 1', 'param2' => 'valor 2'))); devuelve $ resultado;
Navegando a http: // localhost: 8888 / hello / storage / upload muestra la URL de retorno desde la cual puedo ver el archivo cargado, porque especifiqué lectura pública
en mi código de arriba:
A su vez, al buscar en la dirección S3 anterior se muestra el contenido del archivo cargado:
Esta es una prueba para subir a S3.
Aquí está el código del controlador para descargar un archivo:
función pública actionDownload () $ s = new Storage (); $ f = $ s-> descargar ('jeff-reifman-wp', 'archivos / 2013/01 / i103-wedding-cover.jpg'); // descargar el encabezado del archivo ('Content-Type:'. $ f ['ContentType']); echo $ f ['Body'];
Dado que el navegador responde al tipo de contenido, debería mostrar la imagen apropiada, que solicito aquí.
Nota: Estoy descargando una imagen de portada de mi experiencia al casarme con una corporación llamada Persona Corporativa con una mujer (sí, en realidad sucedió). El matrimonio no funcionó a largo plazo..
Aquí está el código de modelo de almacenamiento para descargar:
descarga de función pública ($ bucket = ", $ key =") // obtener el último objeto de s3 // $ object = end ($ resultado ['Contenido']); // $ clave = $ objeto ['Clave']; $ file = $ this-> s3-> getObject (['Bucket' => $ bucket, 'Key' => $ key,]); devuelve $ archivo; // guardarlo en el disco
Esto es lo que ve cuando el archivo se transmite al navegador: esa es la novia que celebra al agitar la licencia de matrimonio real a la persona corporativa (sonrío en el fondo, misión cumplida).
Ciertamente, puede almacenar fácilmente los resultados en su servidor en un archivo. Tu decides. Te animo a que juegues con el código y lo personalices según lo necesites..
Espero que esto te ayude con los conceptos básicos del uso de AWS S3 desde tu aplicación Yii..
Si le gusta el concepto de almacenamiento de archivos y objetos basado en la nube pero desea encontrar otros proveedores, consulte Alternativas a Amazon AWS. Me he estado alejando gradualmente de AWS por varias razones mencionadas en el artículo. Una de mis próximas tareas es migrar mis objetos S3 que todavía están parcialmente en uso a mi propio servidor, que puedo reflejar con KeyCDN.
Vea los próximos tutoriales en nuestra serie Programming With Yii2 a medida que continuamos explorando diferentes aspectos del marco. También puede consultar nuestra serie Construyendo su inicio con PHP, que utiliza la plantilla avanzada de Yii2 mientras construimos una aplicación del mundo real. La aplicación Meeting Planner en la serie de inicio ya está lista para su uso, y todo está integrado en Yii.
Si quieres saber cuándo llegará el próximo tutorial de Yii2, sígueme @reifman en Twitter o visita la página de mi instructor.