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. Phalcon The  Fastest  PHP  Framework Rack  Lin  阿土伯   @phpcon8w2013

  2. 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/      (生小孩後就變癈墟)  
  3. 2012  cphalcon  contributors

  4. 2013  cphalcon  contributors

  5.   學如逆⽔水⾏行⾈舟、不進則退     在 Open  Source  更是如此  

  6. Phalcon  Framework   Phalcon  Kernel   Zephir  

  7. Phalcon  Dev  Box !   Virtual  Machine  for  PhalconPHP  Development

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

     Usage   !  Cross-­‐PlaZorm   !  Highly  Decoupled   !   Full-­‐stack  Framework   C 實作
  9. 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
  10. 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  
  11. 所以結論…   為了快!專案要用 c  /  c++  來寫  web    

  12. Raphters !   A  web  framework  for  C

  13. 除了慣C哥     大部份人打完招呼   Hello  World!   不知道要做什麼…..

  14. Fibonacci  as  php  extension

  15. Fibonacci  as  php  extension 0m0.79s        馬上變成第二名

  16. 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  
  17. 速度只要出問題,  C  都能搞定

  18.   平衡   A  PHP  web  framework     delivered

     as  a  C  extension  
  19. Frameworks  benchmark

  20. Frameworks  benchmark

  21.  速度不是問題?

  22. None
  23. None
  24. None
  25. Raspberry  Pi

  26. 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
  27. 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  
  28. 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  
  29. Highly  Decoupled !   Ex.  Validamon

  30. 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  
  31. 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)  
  32. Phalcon  Development  Tools ! WebDevTools  

  33. Phalcon  Development  Tools !   Command  Line  Tools  

  34. 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.    
  35. CLI  Launcher

  36. CLI  MainTask Php  console.php    //  MainTask::mainAcmon   Php  console.php

     main  test  //  MainTask::testAcmon  
  37. Phalcon  Kernel

  38. Phalcon  Kernel(2012~) !   2012  PHPConfTW     ! Phalcon

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

     0.5.x  Source  Code  分離出來的專案。   ! hNps://github.com/racklin/phalcon_kernel   !   Ant  的 phpWoWExtension  專案。   ! hNps://github.com/y8zeng/phpWowExtension  
  40. 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.  
  41. Phalcon  Kernel(2012~) !   基於 ZEND  API   !  

    提供大量 Helper  funcmons  /  macros   ! php  style    的 c  開發風格  
  42. Zend  API

  43. 眼皮忍耐一下!    

  44. None
  45. zval

  46. PHP>        $greemng

  47. Data  Types Long Boolean Double String  value ZVAL_LONG() ZVAL_BOOL() ZVAL_DOUBLE()

    ZVAL_STRING() NULL ZVAL_NULL() Create  macro
  48. 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()
  49. 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)
  50. 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  的記 憶體
  51. MM  Sample

  52. MM  Sample

  53. 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);  
  54. 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)  \
  55. 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  
  56. 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 個參數  
  57. Call  Funcmons PHP  Code

  58. Call  Funcmons

  59. 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  個參數  
  60. Call  Methods

  61. OK!  Wake  UP!

  62. c9s  ValidamonKit hNps://github.com/c9s/ValidamonKit     c  extension  DEMO    

    速度快 3  倍    
  63. 寫 C  就像談戀愛     即期待   又怕受傷害  

  64. 大部份人對於 C

  65. Zephir

  66. 大海賊 DSL  時代來臨 ! Javascript   ! CoffeeScript  ,  LiveScript

     ,    TypeScript.   !   Java   ! Scala  ,  Groovy,  Clojure   !   GNOME  GObject  C   ! Vala   ! Zend  Engine  C   ! Zephir    
  67. 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++
  68. CompilaLon  Scheme

  69. Hello  World!

  70. Hello  World! 開頭少了 <?php     語法幾乎相同。

  71. Hello  World  Generated  C

  72. Zephir  -­‐  PHP  Syntax  Like

  73. Generated  C

  74. 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)
  75. 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)  
  76. Variable  DeclaraLons !   Declaramons

  77. Variable  Assignment !   Assignment  /  Value  Change   !

      MUST  Using    let  keyword.
  78. Dynamic  Types

  79. Stamc  Types

  80. Arrays

  81. Hashes NOT  PHP        k  =>  v  

    NOT  JSON  
  82. 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:    
  83. Calling  FuncLons !   To  call  a  PHP  funcmon,  you

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

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

       (自己動手,別花錢買 ionCube  啦)
  86. b2p  go  back  to  PHP

  87. Phalcon  2.0 ! Phalcon  2.0  is  currently  being  rewriNen  in

     Zephir.
  88. Phalcon  2.0 ! Phalcon  2.0  is  currently  being  rewriNen  in

     Zephir.
  89. 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.    
  90. None
  91. 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  
  92. Thank  You