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

Phalcon / Phalcon Kernel / Zephir 簡介

Phalcon / Phalcon Kernel / Zephir 簡介

Phalcon Framework 簡介
Phalcon Kernel 核心 functions/macros
Zephir - 基於 Phalcon Kernel 的全新語言。

Rack Lin (阿土伯)

October 05, 2013
Tweet

More Decks by Rack Lin (阿土伯)

Other Decks in Programming

Transcript

  1. about:me !   目前為 ViViPOS  Co.,  Ltd  技術總監   !

      利用 javascript  寫 〞收銀機〞(傳統產業,全新感受)   !   PHP  /  Javascript  /  Java  Programmer  (目前移情於 Scala  )   ! [email protected]   ! hNps://twiNer.com/racklin   ! hNps://www.facebook.com/racklin1002   ! hNp://racklin.blogspot.tw/      (生小孩後就變癈墟)  
  2. Phalcon  Dev  Box !   Virtual  Machine  for  PhalconPHP  Development

      ! hNps://github.com/racklin/phalcon-­‐dev-­‐box   !   Vagrant  /  VirtualBox  
  3. Phalcon  Benefits   !  The  Fastest   !  Few  Memory

     Usage   !  Cross-­‐PlaZorm   !  Highly  Decoupled   !   Full-­‐stack  Framework   C 實作
  4. C  有多快 !   Fibonacci  40  (費式數列)  hNp://bit.ly/Pk8HkJ   Language

    Times C  with  –O2 0m0.202s java 0m1.305s scala 0m1.808s nodejs 0m2.872s Ruby  (1.9.x) 0m37.404s Php  (5.4) 1m17.728s Python  (2.7.2) 1m17.979s Ruby  (1.8.x) 3m35.135s Php  (5.3) 6m17.192s
  5. Fibonacci  40 0   100   200   300  

    400   500   c  with  -­‐ O2   java   scala   nodejs   ruby   1.9.2   php  5.4   ruby   1.8.x   php  5.3  
  6. Fibonacci  圖表 0   50   100   150  

    200   250   300   350   400   450   c  with  -­‐O2  java   scala   nodejs   ruby  1.9.2   php  5.4   ruby  1.8.x   php  5.3  php  ext  
  7. Raspberry  Pi !   OS:  Raspbian  (Debian  7)   !

      Web  Server:  Nginx  1.2.1   !   PHP  5.4.4  (FPM)   !   CPU:  ARMv6  700  MHz   !   RAM:  512MB  (480MB)   !   Disk:  4GB  Class  6  SDHC hNps://gist.github.com/hdogan/5466569
  8. Frameworks  benchmark  Pi 2.89   3.96   5.4   67.38

      0   10   20   30   40   50   60   70   80   Laravel   Yii   CodeIgniter   Phalcon   Requests  per  Second  
  9. Frameworks  benchmark  Pi 345.58   252.61   185.24   14.84

      0   50   100   150   200   250   300   350   400   Laravel   Yii   CodeIgniter   Phalcon   Memory  Usage  
  10. EVERYTHING  YOU  NEED   !   Single  or  Mulm  Module

     MVC  Applicamons     !   Sinatra  /  Slim  /  expressjs    like  Micro  Applicamons.   !   Dependency  Injecmon/Container   !   Universal  Auto-­‐Loader   !   Events  Management   !   ORM  –  MySQL  /  PostgreSQL  (#schema)/  SQLite   !   ODM  for  Mongo  
  11. Template  Engine  Volt   !   Volt  is  an  ultra-­‐fast

     and  designer  friendly  templamng  language   wriNen  in  C  for  PHP.        (TWIG  Extension  only  one  method)   !   Volt  is  inspired  by  Jinja  (Python)  
  12. Console  Applicamon !   Single  /  Mulm  Module  Console  Applicamons

      ! cronjobs   !   Daemon  Applicamon   !   Long-­‐life  applicamon  ,  using  supervisor  and  kill  yourself.   !   Job  Workers   !   Using  supervisor  and  kill  yourself.    
  13. Phalcon  Kernel(2012~) !   2012  PHPConfTW     ! Phalcon

     0.5.x  Source  Code  分離出來的專案。   ! hNps://github.com/racklin/phalcon_kernel   !   Ant  的 phpWowExtension  專案。   ! hNps://github.com/y8zeng/phpWowExtension  
  14. Phalcon  Kernel(~2012) !   2012  PHPConfTW     ! Phalcon

     0.5.x  Source  Code  分離出來的專案。   ! hNps://github.com/racklin/phalcon_kernel   !   Ant  的 phpWoWExtension  專案。   ! hNps://github.com/y8zeng/phpWowExtension  
  15. Phalcon  Kernel(2012~) ! hNps://github.com/phalcon/cphalcon/blob/master/ext/kernel/ README.md   Phalcon  Kernel  is  a

     meta-­‐framework  on  top  of  the  Zend  API  helping  to  create   PHP  extensions  in  an  easier  way  for  a  PHP  developer.     In  order  to  build  a  fast  and  stable  framework,  we  have  created  the  Phalcon   Kernel.  The  use  of  this  API  helps  us  to  write  C  code  in  a  PHP  style.  We  have   developed  a  number  of  funcmons  to  help  the  programmer  to  write  code  more   interoperable  with  PHP  in  a  easier  way.     Phalcon  Kernel  API  is  based  on  the  Zend  API,  but  we  have  added  more   features  to  facilitate  us  the  work.  Phalcon  is  a  very  large  project,  frameworks   need  to  be  developed  and  improved  every  day,  Phalcon  Kernel  API  helps  us   to  write  C  code  that  is  more  stable  and  familiar  to  PHP  developers.  
  16. Phalcon  Kernel(2012~) !   基於 ZEND  API   !  

    提供大量 Helper  funcmons  /  macros   ! php  style    的 c  開發風格  
  17. Data  Types Long Boolean Double String  value String  Length Z_LVAL()

    Z_BVAL() Z_DVAL() Z_STRVAL() Z_STRLEN() Z_LVAL_P() Z_BVAL_P() Z_DVAL_P() Z_STRVAL_P() Z_STRLEN_P() HashTable Object Z_ARRVAL() Z_OBJVAL() Z_ARRVAL_P() Z_OBJVAL_P() GeNer  and  Idenmfy  macro IdenLfy   BOOL Long Double String NULL Z_TYPE() IS_BOOL IS_LONG IS_DOUBLE IS_STRING IS_NULL Z_TYPE_P()
  18. Return  Types Macro Type RETURN_FALSE  /  RETURN_TRUE Boolean RETURN_NULL() NULL

    RETURN_LONG() Long RETURN_DOUBLE() Double RETURN_STRING() String RETURN_CTOR()   RETURN_CCTOR()   RETURN_NCTOR() ZVAL  (Phalcon)
  19. Memory  Management ! Phalcon  Memory  Management  簡化了 Zend  Memory  

    Managemant.   !   PHALCON_MM_GROW()   建立一個 phalcon  memory  entry  結構   !   PHALCON_INIT_VAR   建立並配置記憶體給 zval   並將其設為 null,  且將其指標的指 標存至 phalcon  memory  entry.   !   PHALCON_MM_RESTORE   釋放所有經由 PHALCON_INIT_VAR  配置且 refcount  =1  的記 憶體
  20. String !   ZVAL_STRING()  –  Zend  API      

      ! concat_funcmon  –  Zend  API   ! Concat  macro   PHALCON_INIT_VAR(month);     ZVAL_STRING(month,  "2012",  1);   PHALCON_INIT_VAR(today_is);     ZVAL_STRING(today_is,  "Today  is",  1); PHALCON_INIT_VAR(first_part);   concat_funcmon(first_part,  today_is,  month); PHALCON_INIT_VAR(today);     PHALCON_CONCAT_SVSV(today,  "Today  is",  month,  "  ",  day);  
  21. Concat  Macros #define  PHALCON_CONCAT_SV(result,  op1,  op2)  \   #define  PHALCON_CONCAT_SVS(result,

     op1,  op2,  op3)  \   #define  PHALCON_CONCAT_SVSV(result,  op1,  op2,  op3,  op4)  \   #define  PHALCON_CONCAT_SVSVS(result,  op1,  op2,  op3,  op4,  op5)  \   #define  PHALCON_CONCAT_SVSVSV(result,  op1,  op2,  op3,  op4,  op5,  op6)  \   #define  PHALCON_CONCAT_SVSVSVS(result,  op1,  op2,  op3,  op4,  op5,  op6,  op7)  \   #define  PHALCON_CONCAT_SVSVV(result,  op1,  op2,  op3,  op4,  op5)  \   #define  PHALCON_CONCAT_SVV(result,  op1,  op2,  op3)  \   #define  PHALCON_CONCAT_VS(result,  op1,  op2)  \   #define  PHALCON_CONCAT_VSV(result,  op1,  op2,  op3)  \   #define  PHALCON_CONCAT_VSVS(result,  op1,  op2,  op3,  op4)  \   #define  PHALCON_CONCAT_VSVSVS(result,  op1,  op2,  op3,  op4,  op5,  op6)  \   #define  PHALCON_CONCAT_VSVSVSV(result,  op1,  op2,  op3,  op4,  op5,  op6,  op7)  \   #define  PHALCON_CONCAT_VV(result,  op1,  op2)  \   #define  PHALCON_CONCAT_VVSV(result,  op1,  op2,  op3,  op4)  \   #define  PHALCON_CONCAT_VVV(result,  op1,  op2,  op3)  \   #define  PHALCON_CONCAT_VVVVV(result,  op1,  op2,  op3,  op4,  op5)  \
  22. Arrays !    array_init(zval*)  –  inimal  as  array   !

      Add  to  array   !    add_next_index_long    /  add_next_index_double   !    add_next_index_bool    /  add_next_index_stringl   !   Get  (index  type)  (*string  length)   ! phalcon_array_fetch_long  /  phalcon_array_fetch_string   !   Update  (index  type)  (*string  length)   ! phalcon_array_update_long  /  phalcon_array_update_string   ! Isset  /  unset    (*string  size)   !    phalcon_array_isset_long  /  phalcon_array_isset_string   !    phalcon_array_unset  /  phalcon_array_unset_string  
  23. Call  Funcmons !   PHALCON_CALL_FUNC     呼叫 PHP  funcmon

     ,有回傳值   !   PHALCON_CALL_FUNC_NORETURN   呼叫 PHP  funcmon  ,沒有回傳值 !   PHALCON_CALL_FUNC_PARAMS_1     呼叫 PHP  funcmon 並傳一個參數,有回傳值   !   PHALCON_CALL_FUNC_PARAMS_1_NORETURN   呼叫 PHP  funcmon 並傳一個參數,沒有回傳值   !   目前巨集定義到傳 3 個參數  
  24. Call  Methods !   PHALCON_CALL_METHOD   呼叫 PHP  funcmon ,有回傳值

      !   PHALCON_CALL_METHOD_NORETURN   呼叫 PHP  funcmon ,沒有回傳值 !   PHALCON_CALL_METHOD_PARAMS_1     呼叫 PHP  funcmon 並傳一個參數,有回傳值   !   PHALCON_CALL_METHOD_PARAMS_1_NORETURN   呼叫 PHP  funcmon 並傳一個參數,沒有回傳值   !   目前巨集定義到傳 5  個參數  
  25. 大海賊 DSL  時代來臨 ! Javascript   ! CoffeeScript  ,  LiveScript

     ,    TypeScript.   !   Java   ! Scala  ,  Groovy,  Clojure   !   GNOME  GObject  C   ! Vala   ! Zend  Engine  C   ! Zephir    
  26. Zephir ! Zephir  -­‐  Ze(nd  Engine)  Ph(p)  I(nte)r(mediate)   !

      A  high  level  language  that  eases  the  creamon  and   maintainability  of  extensions  for  PHP.   ! Zephir  extensions  are  exported  to  C  code  that  can  be  compiled   and  opmmized  by  major  C  compilers  such  as  gcc/clang/vc++
  27. Zephir  features !   Stamc/Dynamic  typing   !   Automamc

     memory  management   !   Produce  object-­‐oriented  libraries  that  can  be  used  in  PHP   !   Produce  faster  and  beNer  code  that  can  be  compiled  by  most   important  C-­‐compilers:  (gcc,  vc++,  clang)   !   The  syntax  of  Zephir  is  inspired  by  C,  PHP,  Rust  and  Javascript.   !   Make  the  code  more  debugable    ??????    (Without  source  map)
  28. Basic !   Organizing  Code  in  Files  and  Namespaces  

    !   Every  file  must  contain  a  class  (and  just  one  class).     !   Every  class  must  have  a  namespace   !   The  directory  structure  must  match  the  names  of  classes  and   namespaces  used.      (  NOT  Follow  PSR-­‐0)  
  29. For  Statement !   A  ‘for’  is  a  control  structure

     that  allows  to  traverse  arrays  or   strings   !       !   Keys  in  hashes  can  be  obtained  in  the  following  way:    
  30. Calling  FuncLons !   To  call  a  PHP  funcmon,  you

     can  just  refer  its  name  in  the  Zephir  
  31. Create  Zephir  Project ! zephir  init  –  Inimal  zephir  project

     and  create  config.json   ! zephir  [compile]  –  Compile  and  Install  compiled  .so  .
  32. DEMO   Hello  World!     Encoder  /  Decoder  Extension

       (自己動手,別花錢買 ionCube  啦)
  33. Is  Zephir  produc0on-­‐ready !   No,  it’s  in  a  very

     alpha  stage.     ! Phalcon  Kernel  is  producmon-­‐ready.     !   If  you  review  generated  c  sources,  it’s  producmon-­‐ready.   !   Keep  Zephir  in  mind.    
  34. References ! Phalcon-­‐dev-­‐box:   ! hNps://github.com/racklin/phalcon-­‐dev-­‐box   !   PHPConfTW2013

     sample  Codes:   ! hNps://github.com/racklin/phpcon8w2013   !   Slides:   ! hNps://speakerdeck.com/racklin/zephir-­‐jian-­‐jie