Slide 1

Slide 1 text

Phalcon  PHP  Framework   The  Fastest  Faster  PHP  Framework 阿土伯

Slide 2

Slide 2 text

about:me !   目前為 ViViPOS  Co.,  Ltd  技術總監   !   利用 javascript  寫 〞收銀機〞(傳統產業,全新感受)   ! CoCo  都可、50嵐、歇腳亭、Yamaha  、星聚點  KTV     !   #3  commiHer  of  cphalcon  repository   !   PHP  /  Javascript  /  Java  Programmer  (目前移情於 Scala  )   ! [email protected]   ! hHps://twiHer.com/racklin   ! hHps://www.facebook.com/racklin1002   ! hHp://racklin.blogspot.tw/      (生小孩後就變癈墟)  

Slide 3

Slide 3 text

議題 ! PhalconPHP  Framework 介紹   ! PhalconPHP  Kernel 介紹   !   DEMO  c9s  ValidaWonKit  porWng  as  php  extension  

Slide 4

Slide 4 text

Programmers  共同的罩門   !  速度最快!   !  使用資源最小!   !  跨平台!    

Slide 5

Slide 5 text

Programmers  共同的罩門   !  速度最快!   !  使用資源最小!   !  跨平台!       所以大家來聽 PhalconPHP  

Slide 6

Slide 6 text

為什麼快 !   Fibonacci  40  (費式數列)  hHp://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

Slide 7

Slide 7 text

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  

Slide 8

Slide 8 text

所以結論…   下一個專案要用 c  /  c++  來寫  web    

Slide 9

Slide 9 text

Raphters !   A  web  framework  for  C

Slide 10

Slide 10 text

WOW!  COOOOOOL~ 看起來好像很容易!

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

PHP  沒救了?

Slide 13

Slide 13 text

Fibonacci  as  php  extension

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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  

Slide 16

Slide 16 text

速度只要出問題,  C  都能搞定

Slide 17

Slide 17 text

漂亮的平衡   A  PHP  web  framework     delivered  as  a  C  extension

Slide 18

Slide 18 text

PHP  extension  frameworks   PhalconPHP   Yaf

Slide 19

Slide 19 text

為什麼不是 Yaf !   Underscore  Class  Name  (  目標 PHP  5.2 和以上版本)   !   Document 實在不多   !   Sample  Codes    更少    

Slide 20

Slide 20 text

為什麼不是 Yaf !   Underscore  Class  Name  ( 目標 PHP  5.2 和以上版本)   !   Document 實在不多   !   Sample  Codes    更少     !   Yet  Another  Framework  (Yaf)     這專案名稱我不喜歡   很怕將來會出一個  What  The  Framework  (WTx)  

Slide 21

Slide 21 text

Frameworks  benchmark

Slide 22

Slide 22 text

Frameworks  memory  usage

Slide 23

Slide 23 text

PhalconPHP  benefits !   PHP  Extension  –  Faster   ! Phalcon  all  Components  are  loosely  coupled   !   Low-­‐Level  OpWmizaWons   !   Using  c-­‐language  ORM  for  PHP   !   PHQL  –  lemon  parser  (SQLite)   !   Well-­‐documented  

Slide 24

Slide 24 text

PhalconPHP  0.5  news !   Namespaces   !   Class  Loader  –  相容於 PSR-­‐0   !   Dependency  Injec8on   !   Events  Manager   !   PDO  Database  Adapters   !   *  支援 SQLite.       !   *  PostgreSQL  支援 Mul8-­‐Schemas   !   *  CLI  Applica8ons   !   Micro  Applica8ons   !   Full  stack  frameworks  

Slide 25

Slide 25 text

PhalconPHP  0.6 !   Object-­‐Document  Mapper  -­‐  MongoDB   !   Volt:  Template  Engine    -­‐  inspired  on  Twig   !   PS.  11/2  Released  

Slide 26

Slide 26 text

Class  Loader   Dependency  InjecWon   Events  Manager       Flexible   Extensible   Plugin-­‐able    

Slide 27

Slide 27 text

Class  Loader !   盡可能不用使用 include  /  require  .   ! registerNamespaces  –  PSR-­‐0  相容   ! registerPrefixes   ! registerClasses   ! registerDirectories  

Slide 28

Slide 28 text

Using  Class  Loader

Slide 29

Slide 29 text

Composer •  類似 PEAR  的套件管理工具,但更方便! 像是 npm  /  brew  。   •  Install  Composer   •  IniWal  project   •  Require  /  Install  libraries   •  Update  libraries   $  curl  -­‐s  hHps://getcomposer.org/installer  |  php $  composer.phar  init $  composer.phar  require  [vendor/name] $  composer.phar  update

Slide 30

Slide 30 text

Composer  Autoloading •  只要加一行在你的程式中   require  'vendor/autoload.php'; hHps://packagist.org/

Slide 31

Slide 31 text

Phalcon  Class  Loader  +     Composer  Autloading ! Phalcon  and  Composer  都是使用 spl_autoload_register  ,   spl_autoload_register 相當聰明,載入類別後會中斷執行, 不會重覆載入   !   註冊 多個 autoload  handlers  是安全的         !   所以只要在 Phalcon  Class  Loader  前先加上一行即可     require  'vendor/autoload.php’;  

Slide 32

Slide 32 text

Dependency  InjecWon !   \Phalcon\DI  實作了 IoC  設計模式,幫助寫出可擴充性、易 於測試、維護的程式碼。   ! PhalconPHP  內部大量利用 DI  將各元件串接起來。    

Slide 33

Slide 33 text

Dependency  InjecWon !   產生新的物件或單例(Singleton) - get  /  getShared   !   傳參數給  Constructor   !   Lazy  loading   !   物件只有在被取得時才會產生   !   Magic     !   如果沒有註冊,會自動試著找同樣的 Class  Name   !   如果可以,全部利用 DI  來產生您的類別實例。

Slide 34

Slide 34 text

DI  範例  (set)

Slide 35

Slide 35 text

DI  範例  (get) !   取得物件   $request  =  $di-­‐>get("request");   !   透過 magic  method   $request  =  $di-­‐>getRequest();   !   Singleton   $request  =  $di-­‐>getShared("request");   !   傳參數給 constructor   $component  =  $di-­‐>get("MyComponent",  array("some-­‐ parameter",  "other"))

Slide 36

Slide 36 text

Events  Manager !   Web  GUI  程式中,我們大量使用 Events 。   !   DOM  Events   !   Events  Manager  -­‐  fire  event  ,  aHach  listener   !   Event  Type  Using  colon  :  as  namespace  separator.    

Slide 37

Slide 37 text

DEMO !   Using  Class  Loader    /  Dependency  InjecWon  /  Events  Manager   for  plugin-­‐able  applicaWons.   !   Linux  Upstart  init  daemon  like  demo   hHp://upstart.ubuntu.com/    (replacement  for  the  venerable   System-­‐V  init)   !   Shopping-­‐Cart  Plugin-­‐able  PromoWons  .  

Slide 38

Slide 38 text

Micro  Framework !   Simple  and  ResTul   !   Frameworks   ! RubyàSinatra,  Cuba ! PythonàFlask,  Pyramid   !   PHP  àSilex,  Slim   !   Java  àNapalm  

Slide 39

Slide 39 text

Micro  Example Not  Found  Handler

Slide 40

Slide 40 text

Full  Stack  Framework !   MVC  Architecture   !   Router  /  Dispatcher   !   View  Helper  /  Template  Engine   !   Filtering  Data   !   Session     !   Cache   !   ACL   !   Logging   !   I18n/l10n  

Slide 41

Slide 41 text

Models CreaWng  Models By  default  model  “Robots”  will  refer  to  the  table  “robots”.

Slide 42

Slide 42 text

Models Finding  Records

Slide 43

Slide 43 text

Models Save  changes

Slide 44

Slide 44 text

Models Finding  with  condiWons  ,  order  and  Limit

Slide 45

Slide 45 text

Models !   RelaWons  

Slide 46

Slide 46 text

Models !   RelaWons  

Slide 47

Slide 47 text

Models !   RelaWons  

Slide 48

Slide 48 text

Models  -­‐  Criteria !   Similar  To     !   Doctrine  QueryBuilder   ! Yii  Query  Object   !   Provides  a  fluent  API.  

Slide 49

Slide 49 text

PHQL !   Similar  To     !   Doctrine  DQL   !   Hibernate  HQL   ! Phalcon  Query  Language  is  a  high  level,  object  oriented  SQL   dialect.   !   High  performance,  Phalcon  provides  a  parser  that  uses  the   same  technology  as  SQLite.  (lemon  parser)   hHp://www.sqlite.org/src/doc/trunk/doc/lemon.html  

Slide 50

Slide 50 text

PHQL Select  Records Select  Records  with  namespaces

Slide 51

Slide 51 text

Controller

Slide 52

Slide 52 text

View  Helpers !   WriWng  and  maintaining  HTML  markup  can  quickly Document  type Produced

Slide 53

Slide 53 text

Template  Engine  -­‐  Volt !   Volt  is  an  ultra-­‐fast  and  designer  friendly  templaWng  language   wriHen  in  C  ,  inspired  on  Twig.

Slide 54

Slide 54 text

Console  ApplicaWon !   CLI  Components   ! cronjobs   !   Daemon  ApplicaWon   !   Long-­‐life  applicaWon  ,  using  supervisor  and  kill  yourself.   !   Job  Workers   !   Using  supervisor  and  kill  yourself.    

Slide 55

Slide 55 text

CLI  Launcher

Slide 56

Slide 56 text

CLI  MainTask Php  console.php    //  MainTask::mainAcWon   Php  console.php  main  test  //  MainTask::testAcWon  

Slide 57

Slide 57 text

CLI  DEMO

Slide 58

Slide 58 text

PhalconPHP  Kernel ! hHps://github.com/racklin/phalcon_kernel   !   由 cphalcon  中抽離出來的專案。   !   提供大量基於 Zend  API  的巨集/工具。   !   簡化 php  extension  開發。  

Slide 59

Slide 59 text

Why  Extension !   Driver  /  Adapter   !   Low-­‐level  NaWve  Code  Libraries   !   Performance   !   EncapsulaWon  /  InformaWon  Hidden   !   For  Developer   !   For  Customers    

Slide 60

Slide 60 text

zval

Slide 61

Slide 61 text

c:  zval  *a       相當於   php:  $a

Slide 62

Slide 62 text

Data  Types Long Boolean Double String  value ZVAL_LONG() ZVAL_BOOL() ZVAL_DOUBLE() ZVAL_STRING() NULL ZVAL_NULL() Create  macro

Slide 63

Slide 63 text

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() GeHer  and  IdenWfy  macro Iden8fy   BOOL Long Double String NULL Z_TYPE() IS_BOOL IS_LONG IS_DOUBLE IS_STRING IS_NULL Z_TYPE_P()

Slide 64

Slide 64 text

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)

Slide 65

Slide 65 text

Memory  Management ! Phalcon  Memory  Management  簡化了 Zend  Memory   Managemant.   !   PHALCON_MM_GROW()   建立一個 phalcon  memory  entry  結構   !   PHALCON_INIT_VAR  /  PHALCON_ALLOC_ZVAL_MM     建立並配置記憶體給 zval   並將其設為 null,  且將其指標的指 標存至 phalcon  memory  entry.   !   PHALCON_MM_RESTORE   釋放所有經由 PHALCON_INIT_VAR  配置且 refcount  =1  的記 憶體

Slide 66

Slide 66 text

Phalcon  MM  Bad  Parts !   PHALCON_ALLOC_ZVAL_MM  or  PHALCON_INIT_VAR   !   如果你 trace  source  code  二者差別只在於一個是先將 zval   pointer  pointer  放入 memory  entry  再設定初始值。一個是先設 定初始值再將 zval  pointer  pointer  放入 memory  entry  ….     !   PHALCON_INIT_VAR  3488  lines   !   PHALCON_ALLOC_ZVAL_MM      468  lines    

Slide 67

Slide 67 text

MM  Sample

Slide 68

Slide 68 text

String !   ZVAL_STRING()  –  Zend  API         ! concat_funcWon  –  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_funcWon(first_part,  today_is,  month); PHALCON_INIT_VAR(today);     PHALCON_CONCAT_SVSV(today,  "Today  is",  month,  "  ",  day);  

Slide 69

Slide 69 text

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)  \

Slide 70

Slide 70 text

Arrays !    array_init(zval*)  –  iniWal  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  

Slide 71

Slide 71 text

Phalcon  Arrays  Bad  Parts !   PHP  String  is  Binary-­‐Safe   !   String  Length  =  Actually  String  Length   !   String  Size  =  String  Length  +  1  bytes(\0)   !   Arrays  fetch  and  update  using  String  Length   !   Arrays  isset  and  unset  using  String  Size   ! Phalcon_array_unset  not  phalcon_array_unset_long

Slide 72

Slide 72 text

Call  FuncWons !   PHALCON_CALL_FUNC     呼叫 PHP  funcWon  ,有回傳值   !   PHALCON_CALL_FUNC_NORETURN   呼叫 PHP  funcWon  ,沒有回傳值 !   PHALCON_CALL_FUNC_PARAMS_1     呼叫 PHP  funcWon 並傳一個參數,有回傳值   !   PHALCON_CALL_FUNC_PARAMS_1_NORETURN   呼叫 PHP  funcWon 並傳一個參數,沒有回傳值   !   目前巨集定義到傳 3 個參數  

Slide 73

Slide 73 text

Call  FuncWons PHP  Code

Slide 74

Slide 74 text

Call  FuncWons

Slide 75

Slide 75 text

Call  Methods !   PHALCON_CALL_METHOD   呼叫 PHP  funcWon ,有回傳值   !   PHALCON_CALL_METHOD_NORETURN   呼叫 PHP  funcWon ,沒有回傳值 !   PHALCON_CALL_METHOD_PARAMS_1     呼叫 PHP  funcWon 並傳一個參數,有回傳值   !   PHALCON_CALL_METHOD_PARAMS_1_NORETURN   呼叫 PHP  funcWon 並傳一個參數,沒有回傳值   !   目前巨集定義到傳 5  個參數  

Slide 76

Slide 76 text

Call  Methods

Slide 77

Slide 77 text

Object  ProperWes !   Update  Property   !    phalcon_update_property_long   !    phalcon_update_property_bool   !    phalcon_update_property_null   !    phalcon_update_property_zval  /   phalcon_update_property_zval_zval   !   Read  Property   !    phalcon_read_property  /  phalcon_read_property_zval   ! Isset  Property   !    phalcon_isset_property  /  phalcon_isset_property_zval  

Slide 78

Slide 78 text

PHP  Style WriWng  c  extension

Slide 79

Slide 79 text

c9s  ValidaWonKit hHps://github.com/c9s/ValidaWonKit     c  extension  DEMO

Slide 80

Slide 80 text

References !   Slide:   hHps://speakerdeck.com/racklin/phalcon-­‐php-­‐framework-­‐and-­‐ phalcon-­‐kernel-­‐introducWon-­‐phpcon€w2012   !   Sample  code:   hHps://github.com/racklin/phpcon€w2012_phalcon   ! PhalconPHP  internal:     hHp://internals.phalconphp.com/en/latest/index.html  

Slide 81

Slide 81 text

Thank  You