Composer es un manejador de dependencias/librerías para proyectos en PHP, mientras que Yii2 es un Framework de desarrollo MVC para proyectos en PHP.
Hace un tiempo que vengo recibiendo este warning cuando actualizo las librerías de composer con mi proyecto en Yii2, si bien es un warning y el sistema seguía funcionando sin problemas no lo quería ver más. A continuación como solucionarlo.
Simple introducción a Amazon Simple Queue Service usando Composer, PHP y la versión 3 del SDK de Amazon. Amazon SQS es un servicio de mensajería para la comunicación entre distintas plataformas y/o dispositivos.
Hace un tiempo que quería empezar a usar SQS para separar la lógica de envío de correos de mi plataforma, en especial desde que tuve problemas en su momento con el servidor SMTP de Mandrill lo que finalizaba en un error para el usuario. En este momento cambie a usar el sistema de mails de Amazon, pero siempre quedé con la intención de separar el procesamiento de emails en caso de tener problemas con esto nuevamente.
Me llamó mucho la atención que los ejemplos de Amazon para el SDK simplemente están basados en S3, por l oque no fue tan sencillo comenzar con SQS como lo hubiera imaginado, casi todos los ejemplos con SQS usaban las librerías antiguas.
Amazon SQS, no solo sirve para poder enviar emails de manera asyncrónica con la aplicación, la verdad es que puedes hacer lo que se te ocurra. Por ahora empezaremos un proyecto desde cero en el cual crearemos mensajes y luego los procesaremos.
Amazon SQS Ejemplo PHP SDK V3
Inicializando El Proyecto de SQS.
Lo primero que necesitamos es instalar las librerías del SDK, por lo crearemos una nueva carpeta y utilizaremos composer para instalarlas. Si no sabes lo que es composer te recomiendo que vayas a su sitio web para instalarlo : https://getcomposer.org/
composer require aws/aws-sdk-php
Con esto crearemos la estructura básica para continuar, en donde las librerías necesarias se descargarán en la nueva carpeta vendor.
Ahora crearemos 3 archivos en la raiz del directorio :
sharedConfig.php que tendrá los datos de conexión y valores por defecto.
createMessage.php que creará la Queue si es que no existe y agregará un nuevo mensaje.
readMessages.php que leerá todos los mensajes que tenemos en el Queue, los procesará y luego los eliminará.
La verdad no es recomendable hardcodiar los datos de conexión, pero como ejemplo está perfecto. Recomiendo usar las variables de entorno para los datos de conexión.
Creando Los Mensajes de SQS
El siguiente código crea la instancia del SDK, y desde ella obtenemos el cliente para SQS, creamos el queue y agregamos un mensaje. Si el nombre del Queue existe hace nada. Si bajaste el código desde el repositorio recuerda crear el archivo sharedConfig.php como aparece en la sección anterior.
Es bueno destacar que cualquier llamada del cliente a amazon puede tener un error que debemos capturar en caso de ser necesario.
createMessage.php
require 'vendor/autoload.php';
include_once 'sharedConfig.php';
// Creamos la clase SDK.
$sdk = new Aws\Sdk($sharedConfig);
// Creamos el cliente SQS desde el SDK
$client = $sdk->createSqs();
// Creamos la QUEUE
$queue_options = array(
'QueueName' => $my_queue_name
);
try {
$client->createQueue($queue_options);
} catch (Exception $exc) {
echo $exc->getTraceAsString();
die('Error creando la queue ' . $exc->getMessage());
}
// Obtenemos la URL de la queue.
$result = $client->getQueueUrl(array('QueueName' => $my_queue_name));
$queue_url = $result->get('QueueUrl');
print_r($queue_url);
// The message we will be sending
$our_message = array(
'tipo' => 'MAIL',
'content' => rand(0, 110000010)
);
// Send the message
try {
$client->sendMessage(array(
'QueueUrl' => $queue_url,
'MessageBody' => json_encode($our_message)
));
} catch (Exception $ex) {
die('Error enviando el mensaje a la queue ' . $e->getMessage());
}
Se cargan las librerías de composer. En este caso solo tenemos las de Amazon SDK
Incluímos el archivo de configuración con las KEY. Recuerda que debes de cear este archivo.
Creamos la instancia del SDK.
Creamos el cliente de SQS.
Creamos las opciones para la creación del Queue.
Creamos el Queue. Recueda que si ya existe no hará nada.
Obtenemos e imprimos en pantalla la url de la Queue.
Creamos el mensaje a agregar a la cola. En este caso nuestro mensaje es un arreglo, por eso usaremos json_enconde al momento de enviar el contenido.
Enviamos el contenido del mensaje.
En este caso solo estamos enviando un mensaje. Sin embargo puedes ejecutar el código cuantas veces quieras. Ejecutando por consola sería :
$ php createMessage.php
Leyendo, Procesando Y Eliminando Los Mensajes de SQS
Ahora a la parte entretenida. En este caso, solo por preferencia, el código se ejecutará por siempre y para no tener el CPU al 100% si es que no existen mensajes pendientes esperaremos un tiempo definido por la variable backoff. Esto lo aprendí cuando hice experimentación con redes inalambricas :).
Con cada iteración se obtendrá un solo mensaje en caso de existir. Si el mensaje no es eliminado, volverá a estar en la cola luego de un tiempo.
readMessages.php
require 'vendor/autoload.php';
include_once 'sharedConfig.php';
// Creamos la clase SDK.
$sdk = new Aws\Sdk($sharedConfig);
// Creamos el cliente SQS desde el SDK
$client = $sdk->createSqs();
// Obtenemos la URL de la queue.
$result = $client->getQueueUrl(array('QueueName' => $my_queue_name));
$queue_url = $result->get('QueueUrl');
/*
* Si no hay un mensaje en el Queue
* esperaremos un tiempo
* definido por backoff y delimitado por
* $backoffMax
*/
$backoff = 0;
$backoffMax = 3;
while (true) {
try {
$message = $client->receiveMessage(array(
'QueueUrl' => $queue_url
));
} catch (Exception $exc) {
echo "No se pudo obtener mensaje \n";
echo $exc->getTraceAsString();
}
if ($message['Messages'] == null) {
// No hay mensajes a procesar.
echo "No hay mensajes a procesar. Duermo.\n";
$backoff += 0.5;
if ($backoff > $backoffMax) {
$backoff = $backoffMax;
}
echo "Espero $backoff segundos";
sleep($backoff);
} else {
$backoff = 0;
echo "Hay mensajes a procesar. Proceso.\n";
// Obtengo la información del mensaje
$result_message = array_pop($message['Messages']);
$queue_handle = $result_message['ReceiptHandle'];
$message_json = $result_message['Body'];
//Imprimimos el contenido del mensaje
print_r($message_json);
echo "\n";
//Ahora eliminamos.
try {
$client->deleteMessage(array(
'QueueUrl' => $queue_url,
'ReceiptHandle' => $queue_handle
));
echo "\t Mensaje eliminado\n";
} catch (Exception $exc) {
echo $exc->getTraceAsString();
echo "\t Mensaje NO eliminado\n";
}
}
}
Ignoraré la explicación de lo que se explicó anteriormente.
La variable backoff corresponde al tiempo de espera para ver si existen nuevos mensajes.
La variable backoffMax corresponde al tiempo máximo de espera.
result_message corresponde al mensaje que desencolamos del Queue.
queue_handler corresponde a la variable a utilizar en caso de que queramos borrar el mensaje.
$message_json corresponde al mensaje en formato json. Recuerda que lo encondificamos al enviarlo.
la funciona deleteMessage hace exactamente eso, elimina el mensaje del Queue.
👉 ¿Te gustó este contenido? Hay más esperando por ti.
Cada semana, comparto aprendizajes y reflexiones que no encontrarás en ningún otro lugar. ¡Únete a la comunidad de más de 9,000 emprendedores que ya están avanzando!
Docker es un software de manejo de contenedores, mientras que PHP7.0 es la última versión de este lenguaje de programación que incluye mejoras que hacen que la velocidad de su funcionamiento sea 50% más veloz que su predecesor. En este tutorial crearemos un ambiente de desarrollo usando Docker con lo cual no tendremos que instalar ningún otro software ni librería para funcionar.
Ya hace un tiempo que quería probar como funcionaba Docker para el desarrollo de aplicaciones para no tener que instalar todo nuevamente en mi máquina. Hace unos días ya llegó mi nueva laptop por lo que ya no tengo excusas para no trabajar y se me ocurrió la brillante idea de procastinar aprendiendo y creando imagenes de Docker en vez de iniciar directamente con lo que debía hacer. El resultado fue satisfactorio por lo que estoy muy contento, así que aprovecho de compartir no solo como desarrollar en PHP7.0 usando Docker, si no que además utilizaremos una imagen que creé para este cometido que incluye todo lo necesario para poder desarrollar sin problemas en PHP7.0, además de herramientas que hacen que el proceso sea más sencillo.
Prerequisitos :
Tener Docker ya instalado.
Los comandos que mostraré son en base a un HOST linux, lo que no quiere decir que la imagen que ocuparemos no funcione con otro HOST.
Woocommerce es una herramienta para generar sitios eCommerce que funciona sobre wordpress. A continuación la implementación para recibir pagos con tarjetas en Chile usando WebpayPlus. Este servicio se convirtó en lo que hoy es pagofacil.cl, recomiendo revisar la página web y ver el siguiente vídeo : https://www.youtube.com/watch?v=BIBx_mBt4-Y Si bien desde hace años que el plugin … Leer más
AWS Elastic Beanstalk es un servicio fácil de utilizar para implementar y escalar servicios y aplicaciones web.
Ahora veremos como hacer el upgrade de la versión de PHP de un servicio ( enviroment ) ya corriendo.
Antes de hacerlo :
Ya debes de estar familiarizado con lo que es ElasticBeanstalk.
Debes de tener los comandos de consola de EB instalasdos ( EB-CLI ).
Asumiremos el upgrade desde una máquina con consola linux.
Creando la configuración inicial.
Antes que todo nos situamos en la carpeta de la aplicación de la cual haremos el upgrade y ejecutamos el comando eb init. Si ya lo habíamos hecho anteriormente usaremos la opción de «interactive» como fue mi caso. Resaltaré en negrita la selección del menú correspondiente.
ctala@BeaTriX-CTMGroup:~/REPOS/tbk-aas-server$ eb init --interactive
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
(default is 3):
Select an application to use
1) APP1
2) APP2
3) APP3
4) [ Create new Application ]
(default is 3): 3
Select the default environment.
You can change this later by typing "eb use [environment_name]".
1) APP3-devel
2) APP3-prod
(default is 1): 2
Select a platform.
1) Node.js
2) PHP
3) Python
4) Ruby
5) Tomcat
6) IIS
7) Docker
8) Multi-container Docker
9) GlassFish
10) Go
11) Java
(default is 1): 2
Select a platform version.
1) PHP 5.4
2) PHP 5.5
3) PHP 5.6
4) PHP 7.0
5) PHP 5.3
(default is 1): 4
Con esto lo que hacemos es decirle a beanstalk como funcionar. Si se creara la aplicación desde cero partiría de inmediato con php7, pero como no es nuestro caso lo que haremos primero es guardar la configuración de nuestro enviroment según lo que tenemos en la nube.
Creando y editando la configuración del enviroment.
Una vez guardada la configuración por defecto la editaremos según lo que necesitemos. En nuestro caso buscamos la línea que define el Stack a ocupar y la editamos.
Cambiaremos esto :
SolutionStack: 64bit Amazon Linux 2016.03 v2.1.3 running PHP 5.6
Por esto
SolutionStack: 64bit Amazon Linux 2016.03 v2.1.3 running PHP 7.0
Si, solo cambiaremos la parte donde sale la versión de PHP. En este caso es sencillo ya que el SolutionStack existe y se llama de esa manera.
Actualizando la configuración en la nube.
Ya teniendo nuestra nueva configuración lo que debemos hacer es subirla a amazon y luego cargarla.
ctala@BeaTriX-CTMGroup:~/REPOS/app3$ eb config put app3-prod-config
ctala@BeaTriX-CTMGroup:~/REPOS/app3$ eb config app3-prod --cfg tbk-aas-server-prod-config
Printing Status: INFO: Environment update is starting.
INFO: Updating environment app3-prod's configuration settings.
INFO: Created Auto Scaling launch configuration named: awseb-e-4g3mx5ymyq-stack-AWSEBAutoScalingLaunchConfiguration-16CD5LSR5ERIN INFO: Auto Scaling group update progress: Rolling update initiated. Terminating 1 obsolete instance(s) in batches of 1, while keeping at least 1 instance(s) in service. Waiting on resource signals with a timeout of PT30M when new instances are added to the autoscaling group.
INFO: Auto Scaling group update progress: Temporarily setting autoscaling group MinSize and DesiredCapacity to 2.
INFO: Environment health has transitioned from Ok to Info. Configuration update in progress (running for 30 seconds).
INFO: Auto Scaling group update progress: New instance(s) added to autoscaling group - Waiting on 1 resource signal(s) with a timeout of PT30M.
INFO: Added instance [i-051d72f3a5ba93b63] to your environment. INFO: Still waiting for the following 1 instances to become healthy: [i-051d72f3a5ba93b63].
INFO: Deleted Auto Scaling launch configuration named: awseb-e-4g3mx5ymyq-stack-AWSEBAutoScalingLaunchConfiguration-10200GU7CE7MB
INFO: Successfully deployed new configuration to environment.
Ahora así de simple hemos actualizado el enviroment para que use la versión de php7 sin tener downtime y manteniendo los servicios relacionados como pueden ser las bases de datos.
Espero que les sirva !
👉 ¿Te gustó este contenido? Hay más esperando por ti.
Cada semana, comparto aprendizajes y reflexiones que no encontrarás en ningún otro lugar. ¡Únete a la comunidad de más de 9,000 emprendedores que ya están avanzando!
Cristian Tala Sánchez
Emprendedor, inversionista, y mentor de diversas Startups y Emprendimientos.
Apasionado de la tecnología, los negocios y la educación. Tanto personal como profesionalmente mi idea es estar siempre buscando la excelencia, sacar lo mejor de mis capacidades, todos los días se puede aprender algo más y estaré feliz de hacerlo.
Mi propósito es ayudar a los emprendedores, lograr que salgan adelante, y potenciar el ecosistema Startup.