June 2nd, 2010 Category: amazon linux Scalabillity
4 Comments »
Estuve probando Amazon Ec2, las conclusiones que saque es que economicamente para un sitio con pocos requerimientos no sirve. Es mucho mas económico y fácil de mantener un VPS ( Virtual Private Server), que usar amazon. Pero cuando tenes un sitio con mucho requeriminento de hardware es ideal.
Voy a contar en que situación Amazon es ideal.
En otro post comparti unos vídeos de una charla de Ricardo Gallir contando como subió meneame en Amazon Ec2 y las ventajas que este le ofrece comparado con otros servicios de hosting. Es normal ver los tweets de @rgallir contando lo aburrido que esta desde que subio meneame a Amazon, ya que siempre anda todo bien.
Lo interesante de Amazon es su tendencia para poder escalar de forma horizontal. Esto es agregando mas procesador, mas memoria, mas disco, o mas instancias, que vendrían a ser como mas servidores en paralelo. Parece complicado pero la verdad es que no, si, es necesario tener conocimientos sobre administración de sistemas o contratar a alguien que los tenga, ya que no tenemos el famoso cpanel para poder configurar todo. Amazon nos ofrece un montón de herramientas muy facil de usar, y de entender para que las queremos, que vamos a adorar y a extranar cuando no tengamos que usar Ec2.
Para sintetizar un poco, Ec2 y todo el kit de productos de Amazon, nos van a ser de utilidad el dia que no podamos mantener todo en un unico servidor y necesitemos contratar servidores secundarios para poder balancear la carga, tanto enviar la base de datos a uno o mas servidores, mover el ad server, manejo de contenido estatico, y demas. O que por ejemplo tengamos picos de visitas tan altos que necesitemos servidores en paralelo en determinados horarios o momentos para poder soportar la demanda. En estas circunstancia o basicamente cuando nuestro vps o dedicado nos quede chico, ahi tenemos que evaluar Amazon Ec2.
Lo explico en numeros.
Para montar un unico sitio con pocos requerimientos de hard, podemos usar una instancia tipo small con 1 solo core, y 1.7 gb ram, vamos a necesitar contratar EBS de 10gb por lo menos, que es para administrar Volumenes no volatiles, ya que las instancias cuando se apagan se borran por completo. Y supongamos que vamos a usar una ip, solo con esto estamos rondando los u$d 90 que si bien no es un precio desorbitante, es caro comparado con un VPS, yo hoy en dia uno de los VPS que contrato estoy pagando $360 que serian tambien unos u$s 90 por un server con 8 core, y casi 2gb ram, y 70gb de espacio, los precios están muy parecidos, pero el tema es que con Amazon ec2 tengo un solo core, comparado con los 8 que me ofrece mi proveedor de hosting. Si quisieramos sumar una instancia Ec2 con un dual core, el precio se nos va casi al doble, y aun asi, seguimos sin poder alcanzar los 8 core, del VPS.
Hoy en dia sigue siendo mas economico, contratar un VPS. No solo por los costos en Hardware sino en mantenimiento, ya que no es lo mismo administrar los servidores desde un amistoso Cpanel, que desde la consola de Amazon.
Obviamente el hardware no es el unico punto para determinar si conviene o no migrar todo a la nube, tambien tenemos los factores de conectividad, y soporte. La realidad es que en Argentina no existe ningun datacenter decente, nada de nada, datattec, el server.com, ARGENTINA.COM (en mayusculas porque va con bronca), y tantos otros que dan vuelta, no estan a la altura de la conectividad, hardware, soporte, que te puede dar una empresa reseller de algun datacenter en Estados Unidos. (No te voy a hacer publicidad Andy, vas a tener que darme algun beneficio si queres que diga que uso datawebhosting ).
Todo esto no quiere decir que no puedas ir migrando tu/s sitios a la nube, tenes varios productos de Amazon que podes ir usando antes de migrar a Ec2. Cloudfront, S3, SQS, etc. Los podes implementar sin necesidad de alojar tu sitio en Ec2. Tambien podes empezar a probar Amazon Ec2 con microsistemas, por ejemplo yo deje un openx con Amazon Ec2 para ir testeando su funcionamiento, gracias a la herramiento cloudwatch, puedo ver las estadisticas de exigencias que tuvo el servidor. Esto es interesante para saber si necesitas aumentar los requerimientos, cloudwatch tiene un costo por cada instancia en el que lo uses
.
Lo Bueno
* Las herramientas, amis, consola, autoscaller, cloudwatch, SQS, S3, EBS, poder usar casi cualquier distro que se te ocurra, tunear tu distro y registrar amis privadas, esto es increible. Todo muy facil, y rapido de usar.
* El poder de escalamiento horizontal.
* Economico si necesitas varios servidores en paralelo, ya que estos se prenden o apagan cuando se necesitan, y no necesitas contratar servicios de 24×7. Las instancias tienen costes minimos por hora.
* Es muy divertido administrar Amazon.
Lo Malo
* Necesita conocimientos medios de administracion de servidores o pagarle a alguien para que lo haga. Me he enterado de muchos clientes que pagan para que algun sysadmin les haga toda la primera configuracion y despues administran todo con Cpanel, Ec2 requiere un mantenimiento especializado casi constante.
* Caro en sitios chicos.
Nada mas, la verdad que me dio bronca no poder conseguir instancias mas poderosas dentro de los usd 100 mensuales, pero igual termine encantado con el mundo Amazon. Dentro de poco voy a poder montar todo un grupo de sitios con alto requerimiento de hardware, y voy a necesitar escalar con varios servidores, y la opcion que voy a manejar es Ec2, en su momento les comentare como fue.
May 13th, 2010 Category: Optimizing Zend Framework
10 Comments »
Puff hace mucho no escribo nada mi nuevo proyecto (http://www.dondejugarpaintball.com) Me esta llevando todo mi tiempo libre.
Voy a mostrarles como implementar de forma simple dos tips de velocidad para tus paginas, el primero es gzip, la idea es que toda la salida de nuestra aplicacion al browser no tenga espacios inecesarios, tabulaciones, y saltos de lineas, en pocas palabras, si vemos el codigo fuente de nuestro sitio vamos a ver solo una linea con todo el contenido html, como pueden ver en http://www.dondejugarpaintball.com. Esto es muy util para ahorrarnos ancho de banda, y obviamente aumentar la velocidad con la que se descarga nuestro contenido.
Esto a simple vista pareceria ser un trabajo de horas, pero como nosotros usamos Zend Framework y toda la info de nuestra aplicacion pasa por nuestro public/index.php con solo editar este archivo podemos conseguir esta mejora en segundos.
Si tienen un archivo index.php standar sin modificaciones, puden copiar y pegar este codigo y es suficiente.
//Con esta linea le indicamos que queremos obtener toda la salida generada
ob_start();
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));
/** Zend_Application */
require_once 'Zend/Application.php';
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap();
$application->run();
// A partir de esta linea conseguimos toda la salida generada y la comprimimos
$cntACmp =ob_get_contents();
ob_end_clean();
$cntACmp=str_replace("\n",' ',$cntACmp);
$cntACmp=ereg_replace('[[:space:]]+',' ',$cntACmp);
ob_start("ob_gzhandler");
echo $cntACmp;
ob_end_flush();
Si guardan y ejecutan su aplicacion, ya tendrian que tener todo su contenido html en una sola linea.
El segundo tips, ya requiere un poco mas de conocimeintos sobre apache.
La idea es que cada vez que alguien pida un contenido estatico como una imagen, o css el apache responda lo mas rapido posible, esto se hace diciendole que nuestro contenido tiene una fecha de expiracion x, y por lo tanto si esa fecha no vario, hay que entregar el mismo contenido que se entrego anteriormente, esto reduce mucho los recursos de nuestro sistema para entregar un contenido estatico. Podemos definir tiempos para cada extension.
Para realizar este cambio necesitamos saber si tenemos el modulo expire de Apache activado.
En caso contrario entramos como sudo y escribimos
sudo a2enmod expire
Reiniciamos apache
/etc/init.d/apache2 reload
Y ya queda activado.
Despues de confirmar que el modulo expire esta activado, editamos nuestro archivo public/.htacces, y agregamos las lineas correspondientes.
#empezamos a definir los tiempos de expiracion de cada contenido
ExpiresActive On
ExpiresDefault A0
ExpiresByType image/gif A25920000
ExpiresByType image/png A25920000
ExpiresByType image/jpg A25920000
ExpiresByType image/jpeg A25920000
ExpiresByType text/css A25920000
ExpiresByType text/javascript A259200000
#estas son nuestras directivas por default
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
April 12th, 2010 Category: Zend Framework
No Comments »
En uno de los proyectos que tengo abierto tengo una aplicacion en Zend Framework en un http://www.dominio.com, cree una aplicacion que complementa a esta primera también en ZF, pero en realidad es otro sitio, otra base, y otro modelo de negocio, pero por un tema de SEO, la segunda aplicacion tenia que ser accesible únicamente desde http://www.dominio.com/segundaAPp/ y no desde http://www.segundaApp.com/.
La solución es muy simple, pero por ahi alguno tiene o tuvo este problema y no supo resolverlo.
En el .htaccess de la aplicacion principal tenemos el siguiente código en una aplicacion creada con Zend_Application.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
Lo que hace es, sino encuentra la carpeta/archivo en el directorio actual, ejecuta el index.php el cual parsea la url, para detectar el modulo, controller, action.
A estas lineas hay que agregarle una regla, que si la uri empieza con segundaApp, hay que redireccionar a el index.php de segundaApp. Mi solución fue crear un symlink desde la segunda aplicacion hasta la app actual con el nombre de la segundaApp.
RewriteEngine On
#segundaApp.php es un symlink a ../../segundaApp/public/index.php
RewriteRule ^ segundaApp.php [NC,L]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
Ahora lo que falta es crear reglas de ruteos dentro de segundaApp para poder redireccionar al controller especifico la url correcta.
Otra forma seria poder agregar módulos dentro de segundApp, pero esto no lo probé, lo que necesitaba lo conseguí perfectamente con esta linea en el .htaccess
El único problema que obtuve con esta forma es con el contenido estático, que siempre lo busco en /imgs/logo.png o /css/core.css, si yo hiciera esto buscaría el contenido estatico dentro de la aplicacion principal, si no comparto contenido lo mejor es usar urls absolutas apuntando por ejemplo a static.segundaApp.com, esta url la pueden obtener con un helper, $this->baseUrl() de ZF puede servir, no recuerdo si envia el dominio completo, pero en el caso que no pueden crear uno que resuelva este problema.
March 18th, 2010 Category: Programacion Zend Framework
14 Comments »
Mi idea era subir un archivo dentro de un formulario, renombrar ese archivo con un id conseguido en esa misma operacion con el siguiente formato logo_{$id}.jpg . El problema es que cuando agregaba el setDestination del form me copiaba el archivo con su nombre original en la carpeta de destino. No conseguia renombrarlo.
Vi muchisimos ejemplos pero al parecer con la nueva version no andan ninguno, porque los que probe no me sirvieron de forma literal (es decir copy/paste ) .
Asi que tuve que ponerme a leer un poco
. Despues de ver como funcionaba Zend_Form_Element_File. Trate de implementar la forma mas logica. La cual no me anduvo. Me acorde que cuando usas isValid de un Zend_Form, este ejecuta los filtros y las validaciones correspondientes. Pero encontre dentro de la documentacion la solucion a mi primer problema, el metodo setValueDisabled( true ) evita que se ejecute el filtro del elemento, asi puedo aplicar mi filtro para renombrar mi archivo despues de validarlo.
Mi segundo problema es que cuando implemente esto, no me guardaba el archivo en donde habia establecido. Para entender esto un poco Zend_Form_Element_File usa Zend_File_Tranfer que es el encargado de manipular el archivo. Lo que siguio fue traerme el adapter de Zend_File_Transfer de mi elemento, agregar los filtros y ejecutar el upload. Y listo tenia mi archivo subido ‘in the ZF way’.
Este es el formulario
class Application_Form_Company extends Zend_Form
{
public function init()
{
$this->setAttrib('enctype', 'multipart/form-data');
$this->addElement('text', 'name', array(
'required' => true,
'validators' => array(
),
'class' => 'sf'
));
$this->addElement('file', 'logo', array(
'class' => 'sf'
));
$this->logo->addValidator( 'Extension', false, 'jpg,png,gif,jpeg' );
$this->logo->addValidator( 'Size', false, '10024000' );
$this->logo
->setDestination( APPLICATION_PATH . '/../public/empresas/imgs/' )
->setValueDisabled( true );
$this->addElement('text', 'website', array(
'required' => true,
'class' => 'sf'
));
$this->addElement('text', 'telephone', array(
'required' => true,
'class' => 'sf'
));
$this->addElement('textarea', 'information', array(
'required' => true,
'class' => 'sf'
));
$this->setDecorators(
array(
array(
'ViewScript',
array( 'viewScript' => 'company/form.phtml' )
)
)
);
}
}
Asi quedo mi action
...
$form = new Application_Form_Company();
if ( $this->getRequest()->isPost() ) {
$file = $form->logo;
if( $form->isValid($this->getRequest()->getParams()) ) {
$bind = $form->getValues();
$company = new Application_Model_Company();
if( $company->exists( $bind['name'] ) ) {
$form->name->addErrorMessage( "La empresa ya existe" );
} else {
try {
$id = $company->save( $bind );
}catch( Exception $e ) {
$this->_helper->flashMessenger()
->addMessage( 'Hubo un problema, revise los datos' );
}
// Traemos el adapter de Zend_File_Transfer
$upload = $form->logo->getTransferAdapter();
// Lo ideal es que el path lo trajeramos de un archivo de configuracion.
$upload->addFilter('Rename', array(
'target' => APPLICATION_PATH . '/../public/empresas/imgs/logo_'. $id .' .jpg',
'overwrite' => true
));
var_dump( $upload->receive() );
...
March 10th, 2010 Category: Optimizing Scalabillity Zend
4 Comments »
Revisando algunos problemas que tuve hoy con un servidor me volvi a plantear el uso de Zend Server.
Zend Server es un administrador para servidor de aplicaciones web siempre que trabajen con PHP. Este nos permite administrar extensiones, logs, extensiones. Ademas viene con Zend Optimizer+, Zend Data Cache, y Zend Debugger. Este producto de la gente de Zend nos promete manejar una mayor cantidad de usuarios, de datos y codigo.
Dentro de sus principales objetivos es la de proveer una herramienta para escalar y aumentar la performance de nuestro servidor.
En estas diapositivas, la gente de Zend hace una introduccion a Zend Server.
Tambien nos hablan de Performance y Escalabilidad.
Tambien nos brinda un servicio de Colas.
Aca nos muestran como hicieron para optimizar magento el software open source para crear tiendas online.
Instalacion en Debian.
$ sudo vim /etc/apt/source.list
agregamos la siguiente linea
#Zend Server Respository
deb http://repos.zend.com/zend-server/deb server non-free
Agregamos la clave publica del repositorio
$ wget http://repos.zend.com/deb/zend.key -O- | sudo apt-key add -
Actualizamos el repositorio
$ sudo aptitude update
Si queremos instalar php 5.2.x
$ sudo aptitude install zend-server-ce-php-5.2
Si queremos php 5.3.x
$ sudo aptitude install zend-server-ce-php-5.2
Cuando termine la instalacion podemos entrar en https://localhost:10082/ZendServer/ o http://localhost:10082/ZendServer/
Despues de completar el formulario de administracion, sino tuvimos ningun problema vamos a ver la siguiente pantalla.
Con estas diapositivas podemos ver un poco las virtudes de Zend Server un producto totalmente gratuito y facil de instalar. Si necesitan soporte tambien, pueden contratarlo, hay planes para todos los gustos.
March 9th, 2010 Category: Programacion
2 Comments »
En el ultimo google fest que se realizo en Buenos Aires, la gente de Google, comento varias de las ventajas de HTML 5 y como podriamos aprovechar la geolocalizacion. Todavia no hay mucho soporte para HTML 5, las proximas versiones de los Browsers van a empezar a tener mas sopoprte para las nuevas especificaciones.
Armando Sosa realizo un video tutorial explicando claramente que es y cuales son las ventajas de HTML 5
HTML5 para principiantes from Armando Sosa on Vimeo.
Via Buzz Cesar Casas compartio unos ejemplos de juegos y manipulacion de graficos con html 5, sin la necesidad de Flash.
http://www.benjoffe.com/code/games/torus/
http://29a.ch/jswars/
http://www.kevs3d.co.uk/dev/asteroids/
http://9elements.com/io/projects/html5/canvas/
http://www.benjoffe.com/code/demos/canvascape/textures
http://www.benjoffe.com/code/tools/functions3d/
http://www.benjoffe.com/code/toys/spirograph/
www.benjoffe.com
Al parecer HTML 5 va a traer muchos beneficios, en reduccion del codigo html. Hoy en dia podemos ver youtube con el reproductor de HTML 5, aunque no es tan bonito ni tenga las mismas funcionalidades es una alternativa muy fuerte a los reproductores FLASH.
Hay que prestar atencion en como afectara en el SEO con las etiquetas
March 8th, 2010 Category: Zend Framework
2 Comments »
La gente de Dzone( http://www.dzone.com ) hoy subio a su repositorio de refcardz una chuleta o ayuda memoria para iniciarse con Zend Framework, el texto esta en ingles, pero es muy claro.
Lo pueden descargar desde la pagina de dzone (http://refcardz.dzone.com/). Se registran y puden acceder al contenido.
Aca les dejo la copia para verlo online
March 8th, 2010 Category: amazon cloud Programacion
No Comments »
Estuve teniendo unos problemas con un servidor en produccion, y me ocupo la mayor parte de mi ultimo tiempo, por eso no continue los capitulos de … “Escalando nuestras web”. La verdad que en este tiempo lei mucho sobre todo lo que este relacionado con la nube. Uno de los casos de exito que mas me intereso fue el de meneame. Como la mayoria debe saber meneame es un servicio de publicacion de noticias, donde los usuarios menean la noticia o no. Mientras mas meneos tenga mejor vista estara la noticia y conseguiras mas visitas a la misma, ademas de aumenta nuestro karma que es la valorisacion en meneame de un usuario. Pero lo que nos importa a nosotros es que es un sitio con muchisimo trafico. El cual su creador y director Ricardo Gallir decidio montar meneame en la nube.
Los videos que vamos a ver a continuacion son unas charlas que dio, donde explica, el porque y como migro a Amazon toda la estructura de meneame, que como nos va a explicar el no es nada sencillo. El audio esta bastante bajo pero el material es de altisima calidad para perderselo, suban lo maximo que puedan el volumen y disfruten de la conferencia.
Parte 1.
En el video van a encontrar una explicacion sobre el contenido estatico muy interesante en el cual Ricardo nos recomienda tener un dominio totalmente diferente para manejar este tipo de contenido, y tambien nos aconseja si vamos a manejar imagenes muy chicas no conviene usar cloudfront para esto porque encarece mucho los costos, y si usar otro servidor tipo lighthttp o nginx que la tienen mas clara con el manejo de contenido de este tipo. Siempre sobre el puerto 80 y no esas locuras de ponerlo en el 8080 que limitan a los usuarios que acceden desde lugares donde tienen restringidos los puertos.
Tambien nos explica bastante bien como funciona EC2 y que son las instancias. Los costos en un monstruo como Meneame y lo compara con los presupuesto que le dieron empresas como arsys.es entre otras.
Presten atencion a la parte que habla sobre escalado vertical y horizontal, y las herramientas que amazon EC2 nos brinda para esto.
Parte 2.
En la segunda parte vamos a un ejemplo practico como configurar Amazon EC2 para tener nuestra propia instancia y un sitio corriendo
Despues de estas charlas, y algunos comentarios en su blog y en el blog de meneame, Ricardo Gallir practicamente se convirtio en un promotor de Amazon. Tampoco es raro verlo en twitter haciendo comentarios sobre el buen servicio de amazon.
Esta es una opcion que todos deberiamos analizar cuando nuestro trafico requiere recursos que ningun hosting de usd 3 puede ofrecernos.
February 12th, 2010 Category: base de datos mysql Programacion Zend Framework
5 Comments »
Una transacción es un conjunto de operaciones en la base que se
ejecutan por separadas pero están relacionadas la una con la otra y
necesitamos que si se ejecuta una operación se asegure que también lo
haga en las operaciones siguientes.
En los tipos de tablas transaccionales (InnoDb y DBD ) de MySql,
tenemos la opción de determinar cuando hacer un commit, esto nos
permite hacer un rollback en el caso de que no estemos felices con el
resultado de nuestra transacción.
En las tablas del tipo no transaccional (MyIsam) esta opción no
existen porque están seteadas para que se haga un auto commit, esto
significa que no vamos a poder usar transacciones para tablas de Tipo
MyIsam, solo para InnoDb.
Con las tablas InnoDb nosotros podemos controlar cuando hacer el
commit. Podemos revisar que todas las operaciones se hayan realizado
de forma correcta y recién ahí hacer un commit de la transacción.
Con esta forma nosotros nos aseguramos que una operación se ejecute en
su totalidad, e informar al usuario o a quien sea necesario el
resultado de la misma.
La gente de Doctrine en su blog comentan que su ORM aumenta la
velocidad de mysql, ya que ellos manejan transacciones de forma nativa
en todas sus operaciones,
http://www.doctrine-project.org/blog/transactions-and-performance .
Les recomiendo que lean el articulo, aunque esta en ingles es bastante
claro. Quizás el articulo los entusiasme y se metan un poco en el
mundo de los ORM.
Zend Framework como no podía de ser de otra forma tiene soporte para
transacciones. Si tenemos ZF en un sistema con MVC, y tenemos que
hacer una transacción que involucre mas de un modelo, la transacción
la podemos abrir en cualquiera de ellos, y comitearla.
La forma correcta es conseguir el adapter. El cual nos brinda la
interfaz con la conexion a la base de datos. El mismo lo podemos
conseguir llamando al metodo getAdapter de cualquiera de nuestros
modelos.
class TestController extends Zend_Controller_Action
{
public function createAction()
{
$params = $this->_getAllParams();
$model1 = new MyFirstModel();
$model2 = new MySecondModel();
//Conseguimos el Adapter de nuestra conexion
$db = $model1->getAdapter();
// Iniciamos la transaccion
$db->beginTransacction();
try{
$model1->insert( $params );
$model1->insert( $params );
// Sino hubo ningun inconveniente hacemos un commit
$db->commit();
} catch( Exception $e ) {
// Si hubo problemas. Enviamos todo marcha atras
$db->rollBack;
}
}
}
En el código de ejemplo podemos ver como recibimos ciertos datos por
POST/GET y los datos los guardamos en dos modelos diferentes, esas
acciones están dentro de un try/catch, el que nos permite atrapar las
excepciones que podrían ser enviada por alguna de las operaciones que
tenemos dentro de la transacción en cuyo caso ejecutamos el rollback.
Si todo salio bien llamamos al metodo commit.
Si nosotros queremos forzar dentro de nuestros modelos un rollback lo
mas transparente es tirar una excepcion, y desde el controller se
ejecuta el rollback. La forma de generar una excepcion es la
siguiente.
Para saber mas de transacciones nada mejor que ir a las fuentes originals.
MySql http://dev.mysql.com/doc/refman/5.0/es/ansi-diff-transactions.html
Zend Framework http://framework.zend.com/manual/1.10/en/zend.db.adapter.html#zend.db.adapter.transactions
February 8th, 2010 Category: Programacion Zend Framework
1 Comment »
Si ejecutamos un script desde el shell, y necesitamos ejecutar algún resources en particular, como el de la base de datos. Necesitamos instanciar Zend_Application, y ejecutar los resources que necesitemos.
defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
set_include_path(implode(PATH_SEPARATOR, array(
APPLICATION_PATH . '/../library',
get_include_path(),
)));
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
// Iniciamos Zend_Application
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
// Ejecutamos el resource que trae los datos de conexion.
$bootstrap = $application->getBootstrap();
$bootstrap->bootstrap('db');
$dbAdapter = $bootstrap->getResource('db');
$query = 'SELECT count(*) total from users where date(creation_date) = date(now())'
$row = $dbAdapter->fetchRow( $query );
$mail = new Zend_Mail();
$mail->setBodyText( "Hoy se registraron {$row['total']}" );
$mail->setFrom( "mimail@pablo-morales.com" );
$mail->setSubject( "Reporte de nuevos usuarios" );
$mail->send();



