Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

php and sapi and zendengine2 and...


Published on

Published in: Technology

php and sapi and zendengine2 and...

  1. 1. php と SAPI と ZendEngine2 と 2014/01/22 第1回 PHP勉強会@相模原 do_aki
  2. 2. @do_aki
  3. 3. 20代男子の php に対するイメージ (2014年 俺脳内調べ)
  4. 4. 1位 洗練された ZendEngine2 は、たゆまぬ改 良により、マイナバージョンアップですら ABI が変更されうる 2位 トリッキーな Zend Memory Managaer。 その複雑さのためか、ほとんど追加・改良 されることがない (Zend/zend_alloc.c) 3位 SAPIにより、多くの環境に最適化された 入出力が実現されている感じがする 4位 選べる仮想マシン実装。ただし、標準で 提供されている方式以外での実績は未知数 5位 その他
  5. 5. <?php (I talk about) Not php script but php language system #include "php.h"
  6. 6. php のコアって Those who know don't talk. (知ってる人は教えようとしない) Those who talk don't know. (教えてる人はあまり知らない) PHP: Zend API: PHP のコアをハックする より
  7. 7. 書籍、洋書ならphpコアの話あるけどやっぱり古め Advanced PHP Programming (2004) Extending and Embedding PHP (2006)
  8. 8. PHP Architecture PHP Script Web Server or OS Extensions SAPI module Zend Engine2
  9. 9. SAPI module • Web サーバ/OS と PHP の橋渡 し • エントリーポ イントはここ にある • 21種類の bundle module PHP Script Extensions SAPI module Zend Engine2
  10. 10. PHP SAPIs aolserver / apache / apache2filter / apache2handler / apache_hooks / caudium / cgi / cli / continuity / embed / fpm / isapi / litespeed / milter / nsapi / phttpd / pi3web / roxen / thttpd / tux / webjames (under sapi directory in php-5.5.8 source code)
  11. 11. SAPI module SAPI module sapi_module_struct name startup function shutdown function activate function deactivate function ub_write function header_handler function executable_location php_ini_ignore … register and call callback Zend Engine2
  12. 12. ZendEngine2 • Parser / Compiler • VirtualMachine • Memory Manager • Garbage Collection • (TSRM) etc… PHP Script Extensions SAPI module Zend Engine2
  13. 13. PHP(Zend) Extension • Core • Bundle Extensions • PECL Extensions • PHP Ext と Zend Ext の違 いはよくわか らない PHP Script Extensions SAPI module Zend Engine2 PHP extensionとZend extensionの違い - hnwの日記
  14. 14. Extension load and call Zend Engine2 (register) callback PHP Extension zend_module_entry name function entry MINIT function MSHUTDOWN function RINIT function RSHUTDOWN function MINFO function extension version …
  15. 15. PHP Script • <?php • OpCode に変換 され、VM で実 行 • Extension や SAPI module を 介して外部と の入出力が行 われる PHP Script Extensions SAPI module Zend Engine2
  16. 16. SAPI
  17. 17. life of php process TSRM startup (only ZTS) SAPI startup PHP module startup (Zend startup) PHP request startup execute php script PHP request shutdown PHP module shutdown SAPI shutdown TSRM shutdown
  18. 18. startup process in SAPI • prepare sapi_module (sapi_module_struct) • TSRM startup – TSRM:=Thread Safe Resource Manager • SAPI startup – SAPI:= Server API – SG (sapi_globals_struct@main/SAPI.h) • call php_module_startup – main/main.c
  19. 19. php_module_startup • call zend_startup • init some global vars (EG,PG,SG,GC_G) • init some constant – PHP_VERSION,PHP_OS,PHP_SAPI etc... • register auto globals ($_GET, $_POST …) • read and scan ini files • init php (zend) extensions
  20. 20. zend_startup • init GLOBAL TABLE – FUNCTION/CLASS/AUTO_GLOBALS/CONSTANTS • init INI_SCNG / LANG_SCNG • init interned strings • register builtin_functions – strlen, func_get_arg, class_exists, create_function etc... (Zend/zend_builtin_functions.c) • register standard constants – E_ERROR, TRUE, FALSE, NULL etc... • register $GLOBALS
  21. 21. request process (apache) • prepare SG(request_info) • call php_request_startup – reset gc / compile/ executer – init output buffering stack – sapi_activate – init PG(http_globals) • execute php script
  22. 22. process chart UA apache SAPI (mod_php) [load module] zend engine php script php_ap2_ register_hook register_hook [post_config] php_apache_ server_startup sapi_startup / php_module_start up (zend_startup) リクエスト待ち compiler/scann er/ini/function_ table/class_tabl e 等のメモリ 確保
  23. 23. UA apache SAPI (mod_php) zend engine php script php_handler http request [handler] SG(request_info) .query_string from apache php_request_startup ap_get_brigade(input_fi lter… apr_table_get( headers,”cookie”) php_hash_envir onment にて、 $_GET,$_POST, $_COOKIE 等を 構築 sapi_module.read_post sapi_module.read_cookies zend_execute_scripts zend_compile_file zend_execute
  24. 24. UA SAPI (mod_php) apache ap_write apr_table_set or other http response zend engine php script sapi_module.ub_wri te echo (ZEND_ECHO) sapi_module.header _handler header
  25. 25. 最後に • php 処理系の全体像を解説しました • プロセスの持ち方や、startup/shutdown の 制御は SAPI によって異なります • SAPI と ZendEngine2 の責任の境界がイマ イチ分からない (SG や sapi_module の扱 い) • 間違ってたら指摘ください
  26. 26. End Of Slide Let’s enjoy PHP hack life ;-)