Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Campus Party 2012 #CPCO5

Campus Party 2012 #CPCO5

Diapositivas de la presentación en Campus Party 2012

Phalcon PHP

June 27, 2012
Tweet

More Decks by Phalcon PHP

Other Decks in Programming

Transcript

  1. Objetivo •  Construir un verdadero framework de alto rendimiento para

    PHP que sea fácil de usar al mismo tiempo •  Facilitar y aumentar la escalabilidad de proyectos en PHP sin aumentar la complejidad
  2. ¿Porqué? •  El uso de framework se ha convertido en

    obligatorio para el desarrollo PHP profesional •  Los frameworks ofrecen herramientas y facilidades que hacen que nuestro trabajo sea más divertido
  3. ¿Cómo funciona PHP? APC,  Xcache,   eAccelerator   Interpretar  (ejecutar)

     el  árbol  construído  (Zend  Engine)   Revisar  que  el  programa  sea  correcto  a  nivel  sintácCco   (LINT)   Construir  árbol  sintácCco    (consume  memoria)  
  4. Rendimiento en frameworks tradicionales •  Muchos archivos con clases y

    funciones son leídos en cada petición, la continua lectura de disco puede impactar el rendimiento •  La totalidad del código proporcionada por estos frameworks es interpretada en cada petición •  El código de un framework permanece igual entre una petición y otra, ¿porqué cargarlo e interpretarlo una y otra vez?
  5. ¿Cómo funcionan las extensiones de C? 1.  Las extensiones de

    C se cargan una sola vez cuando inicia el servidor junto con PHP 2.  La funcionalidad que provee las extensión está lista para usar desde cualquier archivo PHP 3.  El código no se interpreta en las extensiones, porque las extensiones están compiladas para una plataforma específica
  6. ¿Qué ofrece Phalcon? •  Es un framework por componentes y

    full stack al tiempo, cualquier componente se puede usar sin depender de otros o desarrollar una aplicación completa con él •  Phalcon está directamente engranado con PHP accediendo directamente a sus recursos internos •  Generación de código, helpers, template engine, scaffolding, etc.
  7. Frameworks Tradicionales Phalcon Interpretación de cientos ó miles de líneas

    en PHP Sí No Cargar docenas de archivos por petición Sí No Revisar la existencia de clases, funciones, variables cada vez, en cada petición Sí No Realizar optimizaciones de bajo nivel para ganar rendimiento No Sí ¿Cómo Phalcon es más rápido con respecto a los frameworks tradicionales?
  8. Poca  ayuda  al   programador   Rendimiento   Mayor  

    Alta  ayuda  al   programador   Rendimiento   Menor   Alta  ayuda  al   programador   Rendimiento   Mayor   Ayuda/Rendimiento
  9. Tiempo  que  tarda  en  iniciar  el  framework   Lógica  de

     Aplicación  (Hello!)   Tiempo  que  tarda  en  finalizar  la  peCción   ¿Qué se mide con un “Hola Mundo”?
  10. •  Sistema Operativo: Mac OS X Snow Leopard 10.6.8 • 

    Servidor Web: Apache httpd 2.2.21 •  PHP: 5.3.10 + APC 3.1.9 (Without Xdebug) •  CPU: 3.06 Ghz Intel Core 2 Duo •  Memoria Principal: 4GB 1067 MHz DDR3 •  Disco Duro: 500GB SCSI/SAS HDD Entorno de Pruebas
  11. [#]  ab  -­‐n  1000  -­‐c  5  http://localhost/bench/phalcon/?_url=say/hello   This  is

     ApacheBench,  Version  2.3  <$Revision:  655654  $>   Copyright  1996  Adam  Twiss,  Zeus  Technology  Ltd,  http://www.zeustech.net/   Licensed  to  The  Apache  Software  Foundation,  http://www.apache.org/     Benchmarking  localhost  (be  patient)   Completed  100  requests   Completed  200  requests   Completed  300  requests   Completed  400  requests   Completed  500  requests   Completed  600  requests   Completed  700  requests   Completed  800  requests   Completed  900  requests   Completed  1000  requests   Finished  1000  requests       Server  Software:                Apache/2.2.21   Server  Hostname:                localhost   Server  Port:                        80     Document  Path:                    /bench/phalcon/?_url=say/hello   Document  Length:                16  bytes     Concurrency  Level:            5   Time  taken  for  tests:      0.402  seconds   Complete  requests:            1000   Failed  requests:                0   Write  errors:                      0   Total  transferred:            187000  bytes   HTML  transferred:              16000  bytes   Requests  per  second:        2489.26  [#/sec]  (mean)   Time  per  request:              2.009  [ms]  (mean)   Time  per  request:              0.402  [ms]  (mean,  across  all  concurrent  requests)   Transfer  rate:                    454.58  [Kbytes/sec]  received     Connection  Times  (ms)                              min    mean[+/-­‐sd]  median      max   Connect:                0        0      0.3            0              4   Processing:          1        2      1.5            1            36   Waiting:                0        1      1.4            1            30  
  12. Peticiones atendidas por segundo 0   500   1000  

    1500   2000   2500   3000   122.15   234.53   564.49   623.44   762.55   844.63   2599.46   #  PeCciones/sg  
  13. Tiempo Promedio en las 1000 Peticiones 0   1  

    2   3   4   5   6   7   8   9   8.186   4.264   1.711   1.603   1.311   1.184   0.385   Tiempo  Promedio  sg  
  14. Número de Archivos Interpretados por Petición 0   20  

    40   60   80   100   120   117   66   46   36   30   23   4   Número  Archivos  
  15. Memoria consumida por petición 0   0.5   1  

    1.5   2   2.5   3   3.5   3.5   3   1.75   1.25   1.1   1   0.75   Memoria  (MB)  
  16. mysql>  desc  products;   +-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+   |  Field    

                       |  Type                          |  Null  |  Key  |  Default  |  Extra                    |   +-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+   |  id                              |  int(10)  unsigned  |  NO      |  PRI  |  NULL        |  auto_increment  |   |  product_types_id  |  int(10)  unsigned  |  NO      |  MUL  |  NULL        |                                |   |  name                          |  varchar(70)            |  NO      |          |  NULL        |                                |   |  price                        |  decimal(16,2)        |  NO      |          |  NULL        |                                |   |  active                      |  char(1)                    |  YES    |          |  NULL        |                                |   +-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+   5  rows  in  set  (0.00  sec)   ORM Benchmark
  17. Inserción de 10 registros (Tiempo Total) 500 peticiones/10 concurrentes 0.000

      1.000   2.000   3.000   4.000   5.000   6.000   Doctrine  2   Phalcon   5.922   2.375   Tiempo  Total/sg  
  18. Inserción de 10 registros (Memoria Petición) 500 peticiones/10 concurrentes 0.000

      1.000   2.000   3.000   4.000   5.000   6.000   7.000   8.000   Doctrine  2   Phalcon   7.424   0.728   Memoria  (MB)  
  19. Consultar e imprimir 10 registros (Tiempo Total) 500 peticiones/10 concurrentes

    0.000   0.500   1.000   1.500   2.000   2.500   Doctrine  2   Phalcon   2.217   0.467   Tiempo/sg  
  20. Consultar e imprimir 10 registros (Memoria Petición) 500 peticiones/10 concurrentes

    0.000   1.000   2.000   3.000   4.000   5.000   6.000   7.000   8.000   9.000   10.000   Doctrine  2   Phalcon   9.984   0.768   Memoria  (MB)  
  21. 1.  HTTP Response – Phalcon_Response 2.  HTTP Request – Phalcon_Request

    3.  Controller Front – Phalcon_Controller_Front 4.  Controller - – Phalcon_Response 5.  Views – Phalcon_View 6.  Cache – Phalcon_Cache 7.  Session Handling – Phalcon_Session 8.  Filter and Sanitize – Phalcon_Filter 9.  Flash Notifications – Phalcon_Flash 10.  Scaffolding – Phalcon_Builder 11.  Config – Phalcon_Config 12.  Database – Phalcon_Db 13.  Logging – Phacon_Logger 14.  Templating – Phalcon_Tag 15.  Multi-lingual apps: Phalcon_Translate 16.  Universal Loader: Phalcon_Loader 17.  Access Control Lists: Phalcon_Acl Componentes
  22. •  ORM (Object-Relational-Mapper) •  Meta-Datos (Memoria, Sesión, APC) •  Validadores

    (Tipos, Regex, Únicos) •  Relaciones Unidireccionales y Bidireccionales •  Llaves foráneas virtuales •  Generadores •  Transacciones •  Generadores de Modelos •  Eventos de Modelos •  Migraciones Phalcon/ORM
  23. 01  <?php     02     03  try  {

        04     05    $front  =  Phalcon_Controller_Front::getInstance();     06   07    //Establecer  directorios  del  MVC   08    $front-­‐>setControllersDir("../app/controllers/");     09    $front-­‐>setModelsDir("../app/models/");     10    $front-­‐>setViewsDir("../app/views/");     11   12    //Imprimir  la  salida  generada   13    echo  $front-­‐>dispatchLoop()-­‐>getContent();     14   15  }     16  catch(Phalcon_Exception  $e)  {     17      echo  "Exception:  ",  $e-­‐>getMessage();     18  }  
  24. 01  <?php     02  //  ../app/models/Productos.php   03  

    04  class  Productos  extends  Phalcon_Model_Base  {     05     06  }     01  //Consultar  todos  los  productos   02  $productos  =  Productos::find();   03   04  //Consultar  el  primer  producto   05  $producto  =  Productos::findFirst();   06     07  //Consultar  productos  ordenados  por  nombre   08  $productos  =  Productos::find([“order”  =>  “nombre”]);    
  25. Warning:  mysqli_real_connect():  (28000/1045):  Access  denied  for  user   'test'@'localhost'  (using

     password:  YES)  in  /var/www/test/app/controllers/ SignupController.php  on  line  15  Phalcon_Db_ExcepCon:  ConnecCon  to  MySQL  failed   File=/var/www/test/app/controllers/SignupController.php  Line=15     #0  [internal  funcCon]:  Phalcon_Db_Adapter_Mysql-­‐ >connect(Object(Phalcon_Config))     #1  [internal  funcCon]:  Phalcon_Db_Adapter_Mysql-­‐ >__construct(Object(Phalcon_Config))    #2  [internal  funcCon]:  Phalcon_Db::factory('Mysql',  Object(Phalcon_Config))  #3   [internal  funcCon]:  Phalcon_Db_Pool::getConnecCon()     #4  [internal  funcCon]:  Phalcon_Model_Manager-­‐>getConnecCon()     #5  [internal  funcCon]:  Phalcon_Model_Manager-­‐>load('Users')     #6  [internal  funcCon]:  Phalcon_Model_Manager-­‐>isModel('Users')     #7  [internal  funcCon]:  Phalcon_Model_Manager-­‐>autoload('Users')     #8  /var/www/test/app/controllers/SignupController.php(15):   spl_autoload_call('Users')     #9  [internal  funcCon]:  SignupController-­‐>registerAcCon('')    #10  [internal  funcCon]:  call_user_func_array(Array,  Array)     #11  [internal  funcCon]:  Phalcon_Dispatcher-­‐>dispatch(Object(Phalcon_Request),   Object(Phalcon_Response),  Object(Phalcon_View),   Object(Phalcon_Model_Manager))   #12  /var/www/test/public/index.php(22):  Phalcon_Controller_Front-­‐>dispatchLoop()     #13  {main}