Vous êtes sur la page 1sur 26

Introduccin a Zend Framework, un poderoso framework que nos ayudar a reducir nuestro tiempo de desarrollo adems de integrar diferentes

apis de distintos sitios como google o flickr haciendo nuestro trabajo ms fcil y rpido. 16 Retweet Compartir17 5

Autor: elericuz Hola! soy Eric de Per. Desarrollo en PHP desde hace 10 aos aunque tambin manejo C++ y Java. Trabajo para una empresa de eventos de juegos pero tambin ejerzo de freelance. Puedes seguirme en mi twitter.

Introduccin a Zend Framework


Zend Framework est desarrollado en php con el afn de hacer el trabajo de los programadores ms simple y amistoso. Est hecho basado en la programacin orientada a objetos pensando en hacer aplicaciones ms seguras orientadas a la web 2.0 y a los web services, utilizando el patrn MVC. Para ello han desarrollado diferentes APIs para servicios populares como Flickr, Google, etc entre otros y han integrado frameworks javascript como Dojo Toolkit y jQuery. ZF est disponible en http://framework.zend.com de forma gratuita. Se instala desempaquetando el archivo comprimido en la ruta en la que estar nuestro host.

Estructura de carpetas
La estructura bsica de carpetas de ZF es la siguiente: 1. -home/ 2. --- application/ 3. ----- config/ 4. ----- controllers/ 5. ------- ErrorController.php 6. ------- IndexController.php 7. ----- models/ 8. ----- views/ 9. ------- scripts/ 10. --------- index/ 11. ----------- index.phtml 12. ----- Bootstrap.php

13. --- library/ 14. ------ Zend 15. --- www/ Analicemos la estructura:

En application, ir en si la aplicacin que realizaremos. En library, ir la librera de Zend (es la que desempaquetamos). www es la caperta expuesta a internet. En ella almacenaremos los js, imgenes, css, y principalmente nuestro archivo index.php.

Esta vez usaremos ZF bajo la convencin modular, esto quiere decir que nuestra aplicacin crecer por mdulos, lo que hace que sea ms escalable y porttil. Cmo? Cada mdulo es una miniaplicacin, permitindonos reutilizarla en diferentes proyectos sin realizar mucho trabajo de adaptacin. Con ello la estructura de la carpeta application sera as: view plaincopy to clipboardprint? 1. -application/ 2. --- config/ 3. --- modules/ 4. ----- default/ 5. ------- controllers/ 6. --------- ErrorController.php 7. --------- IndexController.php 8. ------- views/ 9. --------- scripts/ 10. ----------- error/ 11. ------------- error.phtml 12. ----------- index/ 13. ------------- index.phtml 14. ----- blog/ 15. ------- controllers/ 16. --------- IndexController.php 17. ------- views/ 18. --------- scripts/ 19. ----------- index/ 20. ------------- index.phtml 21. ------- Bootstrap.php <strong><== del mdulo</strong> 22. --- Bootstrap.php <strong><== de la aplicacin</strong> Lo primero que podemos ver es que en el ejemplo, existe una carpeta modules y dentro de ella hay dos mdulos: default y news.

Como mencion antes, cada mdulo es una miniaplicacin, lo que significa que cada uno tendr una configuracin independiente. Siempre usando el patrn MVC. El mdulo por defecto es default. Este es el primero en ejecutarse, es decir que nuestro homepage estar ubicado en este. La aplicacin tiene un arrancador general, que es el archivo Bootstrap.php, en el que se indica cmo funcionar, por ejemplo, las rutas, el cach, la base de datos, etc. Como cada mdulo es una miniaplicacion, cada uno uno debe llevar un archivo Bootstrap.php tambin, excepto el mdulo default que usar el de la aplicacin en s.

Configuracin Bsica
Veamos ahora cmo se programa la aplicacin en lo ms bsico Nuesto nuevo index.php El archivo index.php es de lo ms simple. Solo tenemos que declarar la ruta del Zend y ejecutar la aplicacin. Sera algo as: view plaincopy to clipboardprint? 1. <php 2. DEFINE('ROOT_PATH', dirname(dirname(__FILE__)).'/'); 3. DEFINED('APPLICATION_ENV') || DEFINE('APPLICATION_ENV', (getenv('A PPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); 4. 5. set_include_path(implode(PATH_SEPARATOR, array(ROOT_PATH.'library/', get _include_path()))); 6. 7. require_once 'Zend/Application.php'; 8. $application = new Zend_Application( 9. APPLICATION_ENV, 10. APPLICATION_PATH . 'config/application.ini' 11. ); 12. $application->bootstrap() 13. ->run(); 14. ?> La configuracin de la aplicacin: application.ini Hay un archivo config/application.ini en el que se guarda la configuracin inicial de la aplicacin. Es muy sencillo. Sera as: view plaincopy to clipboardprint? 1. [production]

2. ;error 3. phpSettings.display_startup_errors =0 4. phpSettings.display_errors =0 5. ;include path 6. includePaths.library = LIBRARY_PATH 7. ;bootstrap 8. bootstrap.path = ROOT_PATH "application/Bootstrap.php" 9. bootstrap.class = "Bootstrap" 10. ;resources.frontController 11. resources.frontController.moduleDirectory = ROOT_PATH "application/module s" 12. resources.frontController.moduleControllerDirectoryName = "controllers" 13. resources.frontController.defaultModule = "default" 14. resources.frontController.defaultControllerName = "index" 15. resources.frontController.defaultAction = "index" 16. ;convencion modular 17. resources.modules = 18. ;resources.db 19. resources.db.adapter = "pdo_mysql" 20. resources.db.params.host = "localhost" 21. resources.db.params.username = "usuario_produccion" 22. resources.db.params.password = "hhjj" 23. resources.db.params.dbname = "news" 24. resources.db.isDefaultTableAdapter = true 25. 26. [development : production] 27. phpSettings.display_startup_errors =1 28. phpSettings.display_errors =1 29. resources.db.params.username = "usuario_desarrollo" 30. resources.db.params.password = "nnmm" 31. resources.db.params.dbname = "news_desarrollo" Qu significa todo esto? En ZF se utilizan cuatro estados de trabajo:

[production] [staging : production] [testing : production] [development : production]

Los estados staging, testing y development, heredarn las configuraciones de production, excepto los hayamos reescrito como en el ejemplo anterior con la base de datos. Es til porque podemos pasar de un estado en desarrollo a otro en produccin con tan solo declararlo en el index.php sin tener que volver a escribir las nuevas configuraciones. En application.ini, podemos definir, los errores, el include_path(importantsimo para toda la aplicacin), el bootstrap(se encargar de inicializar el resto de la aplicacin), los layouts, el froncontroller, la base de datos, y la configuracin de las vistas, etc.

Es decir, definimos la configuracin del php que usaremos, el bootstrap, los recursos y los plugins. El arracandor de ZF: el Bootstrap El Bootstrap.php de la aplicacin hereda de Zend_Application_Bootstrap_Bootstrap mientras que el de los mdulos hereda de Zend_Application_Module_Bootstrap. Ambos pueden realizar las mismas tareas. En el Bootstrap, todas las funciones que empiezen por _init se ejecutan automticamente. Estas tienen que ser protected. view plaincopy to clipboardprint? 1. <?php 2. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 3. { 4. protected function _initView() 5. { 6. $view = new Zend_View(); 7. $view->doctype('XHTML1_STRICT'); 8. $view->headTitle()->setSeparator(' :: ')->append('Mi sitio'); 9. $view->headMeta()->appendHttpEquiv('Content-Type', 10. 'text/html; charset=utf-8') 11. ->appendHttpEquiv('expires', '0') 12. ->appendHttpEquiv('pragma', 'no-cache') 13. ->appendHttpEquiv('Cache-Control', 'no-cache'); 14. $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper( 15. 'ViewRenderer' 16. ); 17. $viewRenderer->setView($view); 18. return $view; 19. } 20. } 21. ?> Los controladores El IndexController.php sera como sigue: view plaincopy to clipboardprint? 1. <?php 2. class IndexController extends Zend_Controller_Action 3. { 4. public function indexAction()

5. { 6. $this->view->headTitle('Mi aplicacin'); 7. $this->view->mensaje = $this->mensaje(); 8. } 9. 10. private function mensaje() 11. { 12. return 'qu tal mi aplicacin en ontuts??'; 13. 14. } 15. } 16. ?> Para los controladores de los mdulos, tenemos que indicar la ruta en el nombre de la clase, as: view plaincopy to clipboardprint? 1. class News_IndexController extends Zend_Controller_Action Las vistas Debemos tener en cuenta que cada funcin que termine en Action, necesita un archivo .phtml con el mismo nombre. Por ejemplo indexAction() estar relacionado con index.phtml. Tambin podriamos indicarle que utilice otra vista o no que simplemente no tenga ninguna. La vista para este ejemplo sera index.phtml: view plaincopy to clipboardprint? 1. <?php echo $this->doctype(); ?> 2. <html> 3. <head> 4. <?php echo $this->headMeta(); ?> 5. <?php echo $this->headTitle(); ?> 6. <?php echo $this->headStyle(); ?> 7. <?php echo $this->headScript(); ?> 8. </head> 9. 10. <body> 11. <?php echo $this->mensaje; ?> 12. <br /> 13. que tal mi aplicacion en ontuts <img src="http://web.ontuts.com/wpincludes/images/smilies/icon_razz.gif" alt=":P" class="wp-smiley"> 14. </body> 15. </html>

La pgina de error Antes de ejecutar nuestra aplicacin debemos saber que ZF nos pide que tengamos una pgina de error. De tal manera que ahora s, podremos no nos olvidaremos de hacer nuestra propia pgina de error y podremos conocer cul es, 404 o 505 o el que fuere y as poder darle al usuario final una mejor orientacin de que hacer. Es importante tener en cuenta que sin el controlador ErrorController.php la aplicacin no funcionar. Tenemos que hacer una clase ErrorController y guardarla en el mdulo default. En realidad se maneja igual que cualquier otro controlador y su vista. El mtodo usado dentro de ErrorController deber ser errorAction, el ErrorController.php quedara asi: view plaincopy to clipboardprint? 1. 2. 3. 4. 5. 6. 7. <?php class ErrorController extends Zend_Application_Action { public function errorAction() { } } ?>

Y su vista sera asi (error.phtml): view plaincopy to clipboardprint? 1. <?php echo $this->doctype(); ?> 2. <html> 3. <head> 4. <?php echo $this->headMeta(); ?> 5. <?php echo $this->headTitle(); ?> 6. <?php echo $this->headStyle(); ?> 7. <?php echo $this->headScript(); ?> 8. </head> 9. 10. <body> 11. Error 404 12. La pgina no existe! 13. </body> 14. </html> Y eso es todo hasta aqu por hoy .

Reflexin final

ZF ha sido creado para hacer nuestro trabajo ms simple. Pone a nuestra disposicin adaptadores de diferentes motores de base de datos, de tal manera que para cambiar de, por ejemplo, MySQL a PostgreSQL bastara con modificar solo unas cuantas lneas en su archivo de configuracin. Adems las libreras que nos brinda son muy tiles. Hacer una validacin de usuarios con ZF es muy simple y sobre todo segura usando Zend_Auth o subir un archivo usando Zend_File_Transfer_Adapter_Http es una tarea muy simple. En los siguientes artculos iremos viendo como realizar estas y otras tareas. Esto ha sido solo una introduccin a Zend Framework que espero les ayude en su trabajo como desarrolladores. Si tienen alguna consulta o algo no les qued muy en claro, no duden en dejar su comentario. Nos vemos en el prximo artculo! En este segundo artculo de la serie de introduccin a Zend Framework veremos cmo se trabaja con layouts y cmo nos ayudan a ahorrar tiempo durante la integracin de nuestra programacin con la maquetacin web. 30 Retweet Compartir4 3

Autor: elericuz Hola! soy Eric de Per. Desarrollo en PHP desde hace 10 aos aunque tambin manejo C++ y Java. Trabajo para una empresa de eventos de juegos pero tambin ejerzo de freelance. Puedes seguirme en mi twitter.

Introduccin: Qu son y para qu sirven los Layouts en Zend Framework


Cuando desarrollamos una aplicacin nos damos cuenta que varias de las pantallas son bsicamente iguales y lo nico que cambia son los contenidos interiores de estos. Para muestra un pequeo y sencillo ejemplo:

Como podemos ver en el ejemplo, estructuralmente no hay mucha diferencia entre las dos pginas. En la primera mostramos el home, mientras que en la segunda otro texto cualquiera. Las dos tienen un encabezado y un cuerpo, pero si nos fijamos bien, veremos que solo vara el cuerpo. En el artculo anterior Empezado con Zend Framework, colocamos en las vistas todo el html, desde las etiquetas <html> lo cual est bien porque funciona bien. Pero si tuvisemos una aplicacin con ms 100 vistas (algo que puede darse perfectamente), entonces no sera prctico. Si hiciramos algn cambio en la maquetacin, tendramos que hacerlo en todas las vistas. Imginnlo, nunca terminaramos. Los layouts suelen ser una gran ayuda durante la integracin del php y el html. Nos ahorran mucho trabajo y aunque no es obligatorio su uso, debera ser un estndar en nuestro trabajo con ZF Por suerte existen los layouts. Estos incrustarn todo el contenido colocado en la vista y adems podrn tener el contenido de otros layouts. Podemos crear todos los layouts que necesitemos, sin lmite. Declarando el layout Habr un layout principal para toda la aplicacin. La ubicacin de estos, debido a que es parte de la aplicacin, debera estar dentro de la carpeta de la aplicacin, aunque es posible especificar cualquier otra. Esto lo podemos definir en el archivo application.ini de la siguiente manera: view plaincopy to clipboardprint? 1. ;resources.layout 2. resources.layout.layoutPath 3. resources.layout.layout

= APPLICATION_PATH "layouts/scripts" = "home"

El nombre del archivo del layout ser el que nosotros querramos. En nuestro ejemplo home.phtml pero en application.ini no colocaremos la extensin. Si no declaramos la ruta de los layouts, ZF los buscar en layouts/scripts dentro de la carpeta de la aplicacin. A menudo podremos necesitar layouts para contenido xml o json, o talvez un layout en blanco. Eso depender de lo que necesitemos.

Escribiendo un layout
Veamos un sencillo ejemplo de cmo se escribe un layout: view plaincopy to clipboardprint? 1. 2. 3. 4. 5. <?php echo $this->doctype(); ?> <html> <head> <?php $this->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset='.$this>getEncoding()) 6. ->appendHttpEquiv('Content-Language', 'es-ES'); 7. echo $this->headMeta(); 8. $this->headLink()->appendStylesheet('/css/miestilo.css'); 9. echo $this->headLink(); 10. echo $this->headTitle(); 11. $this->headScript()->appendFile('/js/common.js'); 12. echo $this->headScript(); 13. ?> 14. </head> 15. <body> 16. <div> 17. <div><?php echo $this->layout()->content; ?></div> 18. </div> 19. </body> 20. </html> Como podemos ver, el ejemplo anterior contiene las cabeceras ms importantes del html, pero la lnea siguiente: view plaincopy to clipboardprint? 1. <?php echo $this->layout()->content; ?> es la encargada de insertar el contenido de la vista en el layout. Absolutamente todo lo que est en la vista, se guardar en la variable de layout content.

Qu ocurre con las dems lneas de cdigo? Pues ellas traen contenido declarado en los controladores o en el bootstrap.php. Veamos ahora como sera nuestra vista: view plaincopy to clipboardprint? 1. <?php echo $this->mensaje; ?> 2. <br /> 3. que tal mi aplicacion en ontuts <img src="http://web.ontuts.com/wpincludes/images/smilies/icon_razz.gif" alt=":P"> Podemos notar que el cdigo dentro de la vista se ha reducido a solamente lo que necesitamos de ella. Es importante darnos cuenta de un detalle: $this->layout()->content; almacena el contenido de la vista, pero est dentro del mbito $this-&bt;layout() y a este tambin podemos asignarle otros valores desde el controlador.

Variable de layout
Antes de continuar, quiero regresar unas lineas arribas y que se den cuenta de algo que he escrito y es muy interesante: variable de layout. Y qu es una variable de layout? Desde los controladores, les podemos pasar a las vistas cierta informacin en forma de variable de vista. Ya lo hemos visto antes as: $this->view->mensaje. lo recuerdan? El problema est en que este valor es solo para una vista especfica y para aquella en la que hemos llamado a su Action(). Las variables de layout nos permitirn reutilizar los valores de las variables en las distintas vistas de nuestra aplicacin, en lugar de estar disponibles para una nica vista en particular. Por el contrario, una variable de layout, estar disponible en todas las vistas, sin importar el Action en el que estemos. Es decir, tiene un entorno ms amplio. Noten que digo vistas. Las variables de layouts, se pueden utilizar en todos los layouts y en todas las vistas. Es decir, en todos los archivos .phtml. Pero para qu quiero una variable de layout? Supongamos que me autentifico en mi aplicacin y quiero que en ella aparezca mi nickname (nombre de usuario), siempre en todas las pginas. Podra almacenar ese dato en una variable de layout. La forma en la que declarao esta variable es muy sencilla: view plaincopy to clipboardprint? 1. $this->layout->nickname = 'elericuz';

Por otro lado, en el layout o en la vista, lo nico que necesito hacer para mostrarla es imprimir su valor mediante la funcin echo(): view plaincopy to clipboardprint? 1. echo $this->layout()->nickname;

Controlando los layouts


Ms arriba mencion que a menudo podramos necesitar utilizar diferentes layouts para diferentes tareas. Piensen que el diseo del home ser diferente al diseo de las pginas internas. En ese caso al menos, necesitaremos 2 layouts: home.phtml y internas.phtml home.phtml view plaincopy to clipboardprint? 1. <?php echo $this->doctype(); ?> 2. <html> 3. <head> 4. <?php echo $this->headMeta(); ?> 5. <?php echo $this->headTitle(); ?> 6. <?php echo $this->headStyle(); ?> 7. <?php echo $this->headScript(); ?> 8. </head> 9. 10. <body> 11. <div style="text-align: center;"><?php echo $this->layout()->content; ?></div> 12. </body> 13. </html> internas.phtml view plaincopy to clipboardprint? 1. <?php echo $this->doctype(); ?> 2. <html> 3. <head> 4. <?php echo $this->headMeta(); ?> 5. <?php echo $this->headTitle(); ?> 6. <?php echo $this->headStyle(); ?> 7. <?php echo $this->headScript(); ?> 8. </head> 9. 10. <body>

11.

<div><a href="<?php echo WWW_ROOT; ?>">Home</a> | <a href="<?php ech o WWW_ROOT; ?>prueba">Otro link</a></div> 12. <br /> 13. <?php echo $this->layout()->content; ?> 14. </body> 15. </html> En application.ini le hemos indicado a ZF que utilice home.phtml como layout predeterminado. Solo nos faltara indicarle a ZF que cuando no estemos en el home de nuestra aplicacin use internas.phtml como layout. Eso lo hacemos en el controlador/funcin que queramos as: view plaincopy to clipboardprint? 1. $options = array( 2. 'layout' => 'internas', 3. ); 4. Zend_Layout::startMvc($options); De esta forma podremos cambiar de layout segn nuestras necesidades en cualquier momento de manera cmoda y sencilla.

Reflexin Final
Como hemos visto, los layouts nos ahorran muchas lneas de cdigo y eso los convierte en una herramienta muy importante para nosotros. Si bien esta ha sido una breve explicacin de lo que es un layout, En el siguiente artculo explicar cmo hacer una estructura de layout y desarrollarlo en forma programtica, siempre orientado a objetos. Nos vemos en la prxima publicacin! Presentamos un nuevo y sencillo tutorial para crear servicios de red en Linux, usando PHP y el daemon xinet.d. Como siempre explicaciones paso a paso y fciles de seguir. 37 Retweet Compartir5 1

Autor: Gonzalo Ayuso Gonzalo Ayuso es un desarrollador y arquitecto Web con ms de 10 aos de experiencia, especializado en tecnologas Open Source. Experiencia con desarrollos Web en entornos

industriales. Puedes leerle en su blog gonzalo123.wordpress.com y tambin seguirle en Twitter @gonzalo123

Introduccin
No todo en PHP es Web y HTTP. Podemos usar PHP para muchas otras cosas. Por ejemplo podemos crear de una forma muy sencilla servicios de red. Cuando creamos servicios de red necesitamos obviamente un servidor de red (bien sea TCP o UDP). Cuando trabajamos con Web y HTTP este servidor suele ser Apache (o similares), pero si queremos crear un servicio especfico (no HTTP), adems del servicio de red que queramos crear, necesitaramos crear un servidor. No todo en PHP es Web y HTTP. Podemos usar PHP para muchas otras cosas. Por ejemplo podemos crear de una forma muy sencilla servicios de red. Esto lo podemos hacer con C, Java e incluso con PHP, pero cuando trabajamos en entornos Linux existe un daemon que nos permite desplegar servicios de red de una forma muy sencilla, encargndose de la parte del servidor y dejndonos a nosotros la parte del servicio de red. Este daemon es xinetd. Vamos a ver cmo crear un sencillo servicio de red TCP con xinetd y PHP Empecemos!

Creando el servicio de red TCP con Xinetd y PHP


El ejemplo que vamos a realizar escuchar del puerto 69321, e inicialmente dir Hola cuando alguien realice una peticin TCP a dicho puerto. El script del ejemplo es sumamente complicado: view plaincopy to clipboardprint? 1. // /home/gonzalo/tests/test1.php 2. echo "HELLO\n"; Bien. Ahora lo que queremos es que nuestro servicio de red escuche el puerto tcp 60321. Para esto tenemos que definir en nuestro archivo /etc/services el puerto en cuestin: view plaincopy to clipboardprint? 1. // /etc/services 2. ... 3. myService 60321/tcp # my hello service Y finalmente creamos la configuracin en el daemon xinetd. Para ello creamos el archivo /etc/xinetd.d/myService:

view plaincopy to clipboardprint? 1. # default: on 2. # description: my test service 3. 4. service myService 5. { 6. socket_type = stream 7. protocol = tcp 8. wait = no 9. user = gonzalo 10. server = /usr/local/bin/php-cli 11. server_args = /home/gonzalo/tests/test1.php 12. log_on_success += DURATION 13. nice = 10 14. disable = no 15. } Reiniciamos el daemon para que lea la nueva configuracin del servicio que hemos creado: 1. sudo /etc/init.d/xinetd restart Y listo. Ya tenemos nuestro servicio de red operativo y funcionando. Para probarlo podemos usar un simple telnet al puerto definido: view plaincopy to clipboardprint? 1. 2. 3. 4. 5. 6. 7. telnet localhost 60321 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hola Connection closed by foreign host.

Fcil, no? S pero til, no mucho. Por esto vamos a cambiar un poco es script para que acepte variables de entrada. Esto no es HTTP por lo que no podemos usar las tpicas variables $_POST y $_GET. Lo que tenemos que hacer es leer del stdin. En PHP, al igual que con otros lenguajes, esto es muy sencillo: view plaincopy to clipboardprint? 1. $handle = fopen('php://stdin','r'); 2. $input = fgets($handle);

3. fclose($handle); 4. 5. echo "Hola {$input}"; Reiniciamos el xinetd y tenemos nuestro servicio listo view plaincopy to clipboardprint? 1. 2. 3. 4. 5. telnet localhost 60321 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.

Vemos que el telnet se nos quedar a la espera que introduzcamos un texto. Escribimos: gonzalo y obtenemos: 1. gonzalo 2. Hola gonzalo 3. Connection closed by foreign host.

Conclusin
Y esto es todo. Con este sencillo script vemos que, si bien PHP es un lenguaje destinado principalmente para el desarrollo Web, podemos usarlo para otras cosas, manteniendo su punto fuerte: la sencillez. Para qu nos puede servir esto? Bueno. Para empezar nos sirve para leer datos de dispositivos de red que tengamos por ahi, como bculas, lectores de tarjetas, sensores Muchos de estos dispositivos suelen permitirnos en su configuracin establecer una IP/puerto a la que van a enviar informacin en forma de trama TCP. Tambin podemos usarlo para comunicar procesos de una manera simple, sin necesidad de meternos con servidores XMLRPC/Soap y dems. En fin que es una herramienta ms que tenemos a nuestra disposicin para afrontar nuestros desarrollos. Nos vemos en el prximo artculo! En este artculo analizaremos de forma profunda las sesiones web, desde su definicin hasta su uso y configuracin en PHP. Si todava no tienes qu son, cmo funcionan y para qu sirven este tutorial te ser de gran ayuda. No te lo pierdas! 22 Retweet Compartir15 31

Autor: Ivn Guardado Mi hobbie es la programacin! Llevo unos cuantos aos dedicndome al desarrollo de software y ltimamente especializndome en web. Actualmente trabajo en Cokidoo, de la cual soy cofundador. Si queris podis seguirme por twitter.

Que es una sesin?


Un sesin en una web se puede definir como el recorrido de pginas que un usuario hace en nuestro sitio, desde que entra hasta que lo abandona. Gracias al uso de sesiones podemos reconocer las peticiones de cada usuario y as llevar a cabo acciones especficas, como mostrar informacin adaptada a l o guardar informacin de sus gustos o pginas que ms visita. Podemos entonces decir que pueden diferenciarse dos tipos de sesiones:

Sesiones activas: las que muestran informacin personalizada segn el usuario, por ejemplo, cuando inicia sesin en una web. Sesiones pasivas: el servidor reconoce cada movimiento del usuario y lo almacena de forma que en un futuro, se le mostrar una web con la informacin que al usuario le pueda parecer ms interesante sin que se d cuenta.

Lgicamente, una web puede incorporar los dos tipos de sesiones, vase el caso de los servicios ofrecidos por Google .

Cmo funcionan?
Las sesiones se basan en un identificador generado por visitante, simulando una especie de DNI, de modo que cuando quiera acceder a cualquier pgina de nuestro sitio, mostrar ese DNI y quedar identificado. El identificador ser nico por cada usuario y se le conoce como Session ID (SID). Ahora la pregunta es Como se gestiona dicho SID? pues muy fcil, con Cookies. Si no sabes muy bien que son, te recomiendo mi anterior artculo Introduccin a Cookies en la Web. Una cookie es informacin que se establece desde el servidor y que el navegador del usuario enva en cada peticin de forma abstracta. Entonces, si establecemos en una cookie el identificador de sesin, ya tenemos nuestra tarjeta identificadora lista. Desde el lado del servidor, se debe implementar toda la lgica de la sesin, almacenando todos los SID activos y la informacin relativa a ellos. Esto se puede hacer de mltiples formas: mediante sistema de ficheros, base de datos, memcached o cualquier otro mtodo de almacenamiento de informacin.

Manejo de sesiones en PHP

PHP, como es de esperar tiene todo un set de funciones para el manejo de sesiones de forma que abstrae bastante la labor del desarrollador. Entre otras cosas, llevar a cabo las siguientes tareas:

Identificacin por cookie del SID. Si no existe el SID, crea uno y lo guarda en las cookies. Almacenamiento de informacin relativa al SID en el sistema de ficheros. Gestin del expirado de sesin.

Almacenar y/o recuperar informacin sobre la sesin actual es tan fcil como usar un array global llamado $_SESSION. Con todo esto, el uso de sesiones en PHP se hace realmente fcil. Aunque los creadores de PHP no nos quieren encadenar y nos permiten crear nuestras propias funciones para gestionar las sesiones de forma manual, como veremos ms adelante en un ejemplo. Usando los manejadores de PHP Vamos a mostrar un ejemplo de como crear una sesin por visitante y almacenar informacin persistente durante la sesin view plaincopy to clipboardprint? 1. 2. 3. 4. 5. 6. 7. 8. 9. <?php //Inicia o recupera la sesin session_start(); //Ejemplo de como crear una variable de sesin if(!isset($_SESSION['user_name'])){ $_SESSION['user_name'] = getUserName(); } //Actualiza o crea una variable de sesin $_SESSION['last_access'] = time();

Es importante informar sobre la funcin session_start. Dicha funcin se encarga de crear o cargar una sesin previamente abierta basndose en el SID pasado por cookies. Algo a tener muy en cuenta, es que al estar basado en cookies, el server generar cabeceras HTTP, por lo que es importante llamar a la funcin antes de que se enve cualquier salida de texto. Si no recibirs un error que dice algo como headers already sent. De hecho os recomiendo que pongis la llamada en la primera lnea de vuestro index.php para evitar problemas. Usando manejadores propios

Como hemos dicho, PHP nos permite declarar nuestras propias funciones para gestionar las sesiones de forma personalizada, a continuacin os dejo una clase base que podis rellenar para crear vuestros manejadores: view plaincopy to clipboardprint? 1. <?php 2. /** 3. * Manejador de sesiones 4. * 5. */ 6. class Session 7. { 8. /** 9. * Abre la sesin 10. * @return bool 11. */ 12. public static function open() { 13. } 14. 15. /** 16. * Cierra la sesin 17. * @return bool 18. */ 19. public static function close() { 20. } 21. 22. /** 23. * Lee la sesin 24. * @param int session id 25. * @return string contenido de la sesin 26. */ 27. public static function read($id) { 28. } 29. 30. /** 31. * Guarda la sesin 32. * @param int session id 33. * @param string contenido de la sesin 34. */ 35. public static function write($id, $data) { 36. } 37. 38. /** 39. * Destruye la sesin 40. * @param int session id 41. * @return bool

42. */ 43. public static function destroy($id) { 44. } 45. 46. /** 47. * Colector de basura 48. * @param int life time (sec.) 49. * @return bool 50. */ 51. public static function gc($max) { 52. } Una vez que tengas la clase adaptada a tus necesidades, necesitas indicarle a PHP que use eses mtodos y no los que usa por defecto. Eso se consigue con la funcin session_set_save_handler: view plaincopy to clipboardprint? 1. ini_set('session.save_handler', 'user'); 2. session_set_save_handler(array('Session', 'open'), 3. array('Session', 'close'), 4. array('Session', 'read'), 5. array('Session', 'write'), 6. array('Session', 'destroy'), 7. array('Session', 'gc') 8. ); 9. session_start();

Configuracin de sesiones en PHP


En la documentacin oficial, podis acceder a esta pgina en la que se muestra un listado completo de todas las variables de configuracin (en el fichero php.ini), no obstante, vamos a ver algunas que tienen bastante importancia. session.save_path Especifica en que directorio ser almacenda la informacion de los distintos SID generados. En este directorio tiene que poder escribir el usuario de Apache, que ser el creador de los ficheros en ltima instancia. session.name Especifica el nombre de la sesin por defecto, que ser a su vez el nombre de la cookie establecida por el servidor. Por defecto se llama PHPSESSID pero es recomendable cambiarlo.

session.gc_maxlifetime Es el nmero de segundos tras el cual la informacin almacenda pasa a ser considerada basura y por tanto borrada cuando se lance el colector de basura (Garbage Collector). session.cookie_lifetime Establece los segundos durante los cuales la cookie de sesin va a estar activa. Por defecto est a 0 y por tanto la cookie de sesin durar hasta que el usuario cierre el navegador, como ya habamos visto en Introduccin a Cookies en la Web. Es muy importante diferenciar esta variable de gc_maxlifetime. La funcionalidad de gc_maxlifetime hace la resta de la hora del ltimo acceso menos la hora actual, si el resultado en segundos es mayor que el valor de dicha variable, la sessin se borra. Mientras que cookie_lifetime establece un tiempo de duracin fijo, es decir, si se establace en 60 segundos, la sesin expirar dentro de un minuto aunque el usuario est accediendo continuamente. session.use_only_cookies Esta variable establece que solamente se deben de usar cookies para gestionar las sesiones. Por defecto est activado y es importante no modificarlo. El problema de desactivarlo, es que PHP intentar gestionar las sesiones va parmetros GET en caso de que no estn activadas las cookies en el navegador del usuario. Esto puede llevar a problemas de seguridad y comprometer la privacidad del usuario.

Conclusin
El uso de sesiones con PHP es, como has visto, bastante sencillo, aunque se puede complicar todo lo que quieras si lo quieres gestionar t de forma manual. Os recomiendo que si no tenis experiencia en el tema, probis a experimentar hasta que entendis bien como funciona todo, ya que mucha gente usa las sesiones pero no toda sabe como funciona, y es muy importante siempre, saber lo que est haciendo el backend a la hora de desarrollar. Espero que os haya gustado, nos vemos en el proximo artculo!

Instalar Zend Framework y Zend_Tool para construir proyectos en Windows


In: zend framework
8 feb 2010

Ya sea para iniciar un nuevo proyecto, o para empezar a hacer pruebas con Zend Framework y aprender, necesitamos primero instalar Zend Framework. La instalacin puede ser muy simple con solo copiar la carpeta donde esta la librera; pero se puede utilizar la herramienta Zend_Tool que nos permite realizar operaciones como crear proyecto, mdulo, controlador, actualizando el profile del proyecto en todo momento. El entorno en el que esta hecho este pequeo tutorial es en Windows, habiendo instalado como servidor el conjunto de servidores que contiene XAMPP (Apache, MySQL, PHP, ). Si se ha hecho una instalacin por defecto, XAMPP estar instalado en la ruta C:\xampp\ y dentro estar la carpeta php que contiene el mdulo de PHP y la carpeta htdocs donde esta el sitio web por defecto. En esta ltima carpeta se ha creado una carpeta de prueba llamada testzf para realizar all esta tutorial. Una vez descargado Zend Framework (actualmente la versin 1.10), ya sea el paquete Full o Minimal, se puede proceder a seguir el tutorial:

Del archivo comprimido de Zend Framework, extraer las carpetas bin y library y copiarlas a la carpeta C:\xampp\htdocs\testzf. Abrir una lnea de comandos, pulsando Inicio->Ejecutar, escribir cmd y Aceptar. Situarse en la carpeta C:\xampp\htdocs\testzf:
cd C:\xampp\htdocs\testzf

Editar el PATH de Windows para que ejecute comandos de la carpeta C:\xampp\php:


SET PATH=%PATH%;C:\xampp\php

Para comprobar que ha funcionado, ejecutar los siguientes comandos que devuelven las versiones de PHP y de Zend Framework:
php -version zf show version

Como se puede ver, la versin Zend Framework que devuelve no coincide con la versin que se ha copiado. Esto se debe a que XAMPP, en los numerosos paquetes que trae, se incluye una versin de Zend Framework: con XAMPP 1.7.3, viene la versin 1.9.6. Fsicamente, ese Zend Framework se encuentra en la carpeta C:\xampp\php\PEAR\Zend. Para hacer que PHP detecte la versin que se ha instalado, hay que editar el archivo C:\xampp\php\php.ini y buscar la siguiente lnea:
include_path = ".;C:\xampp\php\PEAR"

Modificarla para aadir el path a la librera copiada:


include_path = ".;C:\xampp\htdocs\testzf\library;C:\xampp\php\PEAR"

CUIDADO! El orden de los paths importa, ya que sin se pueden detectar conflictos al cargar ambas libreras a la vez. La regla es: primero la ms nueva y despus las siguientes.

Si se vuelve a solicitar la versin de Zend Framework, ya tendra que salir la versin que se ha copiado:
C:\xampp\htdocs\testzf\library> zf show version Zend Framework Version: 1.10.0

Ahora hay que sustituir la herramienta Zend_Tool que viene con XAMPP. Primero hay que renombrar dos archivos para no perderlos, y despus copiar los archivos de Zend_Tool de la nueva librera:
rename C:\xampp\php\zf.bat zf.bat.bak rename C:\xampp\php\zf.php zf.php.bak copy C:\xampp\htdocs\testzf\bin\zf.bat C:\xampp\php copy C:\xampp\htdocs\testzf\bin\zf.php C:\xampp\php

Una vez instalado todo, se puede proceder a utilitzar la herramienta Zend_Tool. Para poder ver las diferentes opciones que ofrece esta herramienta, hay que ejecutar:
zf --help

Lo primero es crear el proyecto, ejecutando:


zf create project C:\xampp\htdocs\testzf

En la carpeta del proyecto se ha construido la estructura de directorios del proyecto, y un archivo con nombre .zfproject.xml. Este archivo es el profile del proyecto.

Segn la arquitectura de Zend Framework, todas las peticiones tienen que dirigirse al archivo C:\xampp\htdocs\testzf\public\index.php. Para ello, hay que crear un VirtualHost en el Apache, operacin que se realiza en dos simples pasos:

Primero hay que modificar el sistema de Windows para resolver DNSs. Se edita el archivo C:\WINDOWS\system32\drivers\etc\hosts, y al final del archivo se aade la siguiente lnea:
127.0.0.1 testzf

As, cuando se le solicite a Windows por este dominio (testzf), har las peticiones a si mismo haciendo un loopback.

Ahora hay que configurar Apache, para que las peticiones que reciba solicitando el dominio introducido antes (testzf), se dirijan hacia la carpeta pblica segn Zend

Framework. Para ello, hay que editar el archivo C:\xampp\apache\conf\extra\httpdvhosts.conf, y descomentar la lnea:
##NameVirtualHost *:80

Eliminando las almohadillas:


NameVirtualHost *:80

Y aadiendo al final las siguientes lneas que indican el dominio y la carpeta:


<VirtualHost *:80> ServerName localhost DocumentRoot "C:/xampp/htdocs/" ServerAdmin admin@localhost </VirtualHost> <VirtualHost *:80> ServerName testzf DocumentRoot "C:/xampp/htdocs/testzf/public" SetEnv APPLICATION_ENV "development" <Directory "C:\xampp\htdocs\testzf\public"> DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>

Si todo ha ido correctamente y reiniciando el servidor Apache para que los cambios surjan efecto, al utilizar un navegador y solicitar la pgina web http://testzf, se tiene que obtener pgina como la siguiente:

Falta comentar que la modificacin del PATH se pierde cuando se cierra la ventana de lnea de comandos. Para hacer permanentes las modificaciones, hay que modificar las Variables de entorno. Ms informacin en los siguientes links:

SlideShare Extending Zend_Tool Zend Developer Zone Zend_Tool and ZF 1.8 ZF Reference Guide Zend_Tool

Vous aimerez peut-être aussi