SlideShare a Scribd company logo
1 of 28
php と
SAPI と
ZendEngine2 と
2014/01/22
第1回 PHP勉強会@相模原
do_aki
@do_aki
http://do-aki.net/
20代男子の
php に対するイメージ
(2014年 俺脳内調べ)
1位

洗練された ZendEngine2 は、たゆまぬ改
良により、マイナバージョンアップですら
ABI が変更されうる

2位

トリッキーな Zend Memory Managaer。
その複雑さのためか、ほとんど追加・改良
されることがない (Zend/zend_alloc.c)

3位

SAPIにより、多くの環境に最適化された
入出力が実現されている感じがする

4位 選べる仮想マシン実装。ただし、標準で
提供されている方式以外での実績は未知数
5位 その他
<?php

(I talk about)

Not php script
but php language system

#include "php.h"
php のコアって
Those who know don't talk.
(知ってる人は教えようとしない)
Those who talk don't know.
(教えてる人はあまり知らない)

PHP: Zend API: PHP のコアをハックする より
http://www.php.net/manual/ja/internals2.ze1.zendapi.php
書籍、洋書ならphpコアの話あるけどやっぱり古め

Advanced PHP Programming (2004)
http://books.google.co.jp/books?id=mCpnlNYzqOQC
Extending and Embedding PHP (2006)
http://books.google.co.jp/books?id=zMbGvK17_tYC
PHP Architecture

PHP Script
Web
Server
or

OS

Extensions
SAPI
module

Zend
Engine2
SAPI module
• Web サーバ/OS
と PHP の橋渡
し
• エントリーポ
イントはここ
にある
• 21種類の
bundle module

PHP Script
Extensions
SAPI
module

Zend
Engine2
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)
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
ZendEngine2
• Parser / Compiler
• VirtualMachine
• Memory
Manager
• Garbage
Collection
• (TSRM)
etc…

PHP Script
Extensions
SAPI
module

Zend
Engine2
PHP(Zend) Extension
• Core
• Bundle
Extensions
• PECL
Extensions
• PHP Ext と
Zend Ext の違
いはよくわか
らない

PHP Script
Extensions
SAPI
module

Zend
Engine2

PHP extensionとZend extensionの違い - hnwの日記 http://d.hatena.ne.jp/hnw/20130715
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
…
PHP Script
• <?php
• OpCode に変換
され、VM で実
行
• Extension や
SAPI module を
介して外部と
の入出力が行
われる

PHP Script
Extensions
SAPI
module

Zend
Engine2
SAPI
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
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
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
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
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
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 等のメモリ
確保
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
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
最後に
• php 処理系の全体像を解説しました
• プロセスの持ち方や、startup/shutdown の
制御は SAPI によって異なります
• SAPI と ZendEngine2 の責任の境界がイマ
イチ分からない (SG や sapi_module の扱
い)

• 間違ってたら指摘ください
End Of Slide

Let’s enjoy PHP hack life ;-)

More Related Content

What's hot

Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golang
do_aki
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 

What's hot (20)

Understanding eBPF in a Hurry!
Understanding eBPF in a Hurry!Understanding eBPF in a Hurry!
Understanding eBPF in a Hurry!
 
Debugging linux kernel tools and techniques
Debugging linux kernel tools and  techniquesDebugging linux kernel tools and  techniques
Debugging linux kernel tools and techniques
 
initramfsについて
initramfsについてinitramfsについて
initramfsについて
 
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golang
 
Kernel Recipes 2017 - Understanding the Linux kernel via ftrace - Steven Rostedt
Kernel Recipes 2017 - Understanding the Linux kernel via ftrace - Steven RostedtKernel Recipes 2017 - Understanding the Linux kernel via ftrace - Steven Rostedt
Kernel Recipes 2017 - Understanding the Linux kernel via ftrace - Steven Rostedt
 
Git을 조금 더 알아보자!
Git을 조금 더 알아보자!Git을 조금 더 알아보자!
Git을 조금 더 알아보자!
 
Php and threads ZTS
Php and threads ZTSPhp and threads ZTS
Php and threads ZTS
 
TMUX Rocks!
TMUX Rocks!TMUX Rocks!
TMUX Rocks!
 
Gitの便利ワザ
Gitの便利ワザGitの便利ワザ
Gitの便利ワザ
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
 
Qemu JIT Code Generator and System Emulation
Qemu JIT Code Generator and System EmulationQemu JIT Code Generator and System Emulation
Qemu JIT Code Generator and System Emulation
 
eBPF maps 101
eBPF maps 101eBPF maps 101
eBPF maps 101
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
Yocto bspを作ってみた
Yocto bspを作ってみたYocto bspを作ってみた
Yocto bspを作ってみた
 
ret2plt
ret2pltret2plt
ret2plt
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 
4章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 54章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 5
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 

Viewers also liked

Internal php and gdb php core
Internal php and gdb php coreInternal php and gdb php core
Internal php and gdb php core
alpha86
 
Бренд-комьюнити от Sitko.Ru (Brand-Community of Sitko.Ru)
Бренд-комьюнити от Sitko.Ru (Brand-Community of Sitko.Ru)Бренд-комьюнити от Sitko.Ru (Brand-Community of Sitko.Ru)
Бренд-комьюнити от Sitko.Ru (Brand-Community of Sitko.Ru)
Serj Nazarov
 
Duurzame asfaltontwikkelingen | Jan Voskuilen (InfraTech 2015)
Duurzame asfaltontwikkelingen | Jan Voskuilen (InfraTech 2015)Duurzame asfaltontwikkelingen | Jan Voskuilen (InfraTech 2015)
Duurzame asfaltontwikkelingen | Jan Voskuilen (InfraTech 2015)
CROW
 

Viewers also liked (20)

Php Introduction nikul
Php Introduction nikulPhp Introduction nikul
Php Introduction nikul
 
Internal php and gdb php core
Internal php and gdb php coreInternal php and gdb php core
Internal php and gdb php core
 
A look at FastCgi & Mod_PHP architecture
A look at FastCgi & Mod_PHP architectureA look at FastCgi & Mod_PHP architecture
A look at FastCgi & Mod_PHP architecture
 
Create your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 VeronaCreate your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 Verona
 
Techtalk2015 MOD_PHP vs PHP-FPM
Techtalk2015 MOD_PHP vs PHP-FPMTechtalk2015 MOD_PHP vs PHP-FPM
Techtalk2015 MOD_PHP vs PHP-FPM
 
mod_php vs FastCGI vs FPM vs CLI
mod_php vs FastCGI vs FPM vs CLImod_php vs FastCGI vs FPM vs CLI
mod_php vs FastCGI vs FPM vs CLI
 
X math new pattern exam in Telangana for 2014- 15
X math new pattern exam in Telangana for 2014- 15X math new pattern exam in Telangana for 2014- 15
X math new pattern exam in Telangana for 2014- 15
 
Barometro kayak-2013
Barometro kayak-2013Barometro kayak-2013
Barometro kayak-2013
 
Međuinduktivitet i zračni transformatori (slike)
Međuinduktivitet i zračni transformatori (slike)Međuinduktivitet i zračni transformatori (slike)
Međuinduktivitet i zračni transformatori (slike)
 
Бренд-комьюнити от Sitko.Ru (Brand-Community of Sitko.Ru)
Бренд-комьюнити от Sitko.Ru (Brand-Community of Sitko.Ru)Бренд-комьюнити от Sitko.Ru (Brand-Community of Sitko.Ru)
Бренд-комьюнити от Sitko.Ru (Brand-Community of Sitko.Ru)
 
Conto+termico ordingroma 4_6+feb+2015 (2)
Conto+termico ordingroma 4_6+feb+2015 (2)Conto+termico ordingroma 4_6+feb+2015 (2)
Conto+termico ordingroma 4_6+feb+2015 (2)
 
ספר וטהר לבנו השלם.
ספר וטהר לבנו השלם.ספר וטהר לבנו השלם.
ספר וטהר לבנו השלם.
 
Gianni Marconato - Costruire conoscenza professionale in rete attraverso la n...
Gianni Marconato - Costruire conoscenza professionale in rete attraverso la n...Gianni Marconato - Costruire conoscenza professionale in rete attraverso la n...
Gianni Marconato - Costruire conoscenza professionale in rete attraverso la n...
 
Privacy-Aware Data Management in Information Networks - SIGMOD 2011 Tutorial
Privacy-Aware Data Management in Information Networks - SIGMOD 2011 TutorialPrivacy-Aware Data Management in Information Networks - SIGMOD 2011 Tutorial
Privacy-Aware Data Management in Information Networks - SIGMOD 2011 Tutorial
 
Happy New Year
Happy New Year Happy New Year
Happy New Year
 
電子書刺激擴大閱讀產業
電子書刺激擴大閱讀產業電子書刺激擴大閱讀產業
電子書刺激擴大閱讀產業
 
AOA - Annual OMEL Conference Encourages Osteopathic Discourse
AOA - Annual OMEL Conference Encourages Osteopathic Discourse AOA - Annual OMEL Conference Encourages Osteopathic Discourse
AOA - Annual OMEL Conference Encourages Osteopathic Discourse
 
Ta mnimeiaeinaigiromas167
Ta mnimeiaeinaigiromas167Ta mnimeiaeinaigiromas167
Ta mnimeiaeinaigiromas167
 
Curing Shopper Boredom
Curing Shopper BoredomCuring Shopper Boredom
Curing Shopper Boredom
 
Duurzame asfaltontwikkelingen | Jan Voskuilen (InfraTech 2015)
Duurzame asfaltontwikkelingen | Jan Voskuilen (InfraTech 2015)Duurzame asfaltontwikkelingen | Jan Voskuilen (InfraTech 2015)
Duurzame asfaltontwikkelingen | Jan Voskuilen (InfraTech 2015)
 

Similar to php and sapi and zendengine2 and...

WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
do_aki
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osaka
Naotaka Jay HOTTA
 

Similar to php and sapi and zendengine2 and... (20)

OSS開発勉強会-03
OSS開発勉強会-03OSS開発勉強会-03
OSS開発勉強会-03
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
ZendStudioのご紹介
ZendStudioのご紹介ZendStudioのご紹介
ZendStudioのご紹介
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
PHPの今とこれから2020
PHPの今とこれから2020PHPの今とこれから2020
PHPの今とこれから2020
 
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るPHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見る
 
PSGIへの誘い
PSGIへの誘いPSGIへの誘い
PSGIへの誘い
 
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法スクリプト言語PHP攻略法
スクリプト言語PHP攻略法
 
【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門 【学習メモ#6th】12ステップで作る組込みOS自作入門
【学習メモ#6th】12ステップで作る組込みOS自作入門
 
8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室
 
Php5.4
Php5.4Php5.4
Php5.4
 
phpext-2-takagi
phpext-2-takagiphpext-2-takagi
phpext-2-takagi
 
Cloudstack user group meeting in osaka
Cloudstack user group meeting in osakaCloudstack user group meeting in osaka
Cloudstack user group meeting in osaka
 
最近作ったもの
最近作ったもの最近作ったもの
最近作ったもの
 
Linux daemonとsupervisordの美味しい関係
Linux daemonとsupervisordの美味しい関係Linux daemonとsupervisordの美味しい関係
Linux daemonとsupervisordの美味しい関係
 
Windows で PHP をビルドしてみた
Windows で PHP をビルドしてみたWindows で PHP をビルドしてみた
Windows で PHP をビルドしてみた
 
5分でわかるphalcon php
5分でわかるphalcon php5分でわかるphalcon php
5分でわかるphalcon php
 
5分でわかるPhalconPHP
5分でわかるPhalconPHP5分でわかるPhalconPHP
5分でわかるPhalconPHP
 
PHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くPHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩く
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 

More from do_aki

N:1 Replication meets MHA
N:1 Replication meets MHAN:1 Replication meets MHA
N:1 Replication meets MHA
do_aki
 
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editorセキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
do_aki
 
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
do_aki
 
Immortal
ImmortalImmortal
Immortal
do_aki
 

More from do_aki (20)

Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
 
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
 
php7's ast
php7's astphp7's ast
php7's ast
 
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer HintN対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
 
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
 
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
 
20141017 introduce razor
20141017 introduce razor20141017 introduce razor
20141017 introduce razor
 
20141011 mastering mysqlnd
20141011 mastering mysqlnd20141011 mastering mysqlnd
20141011 mastering mysqlnd
 
php in ruby
php in rubyphp in ruby
php in ruby
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
 
N:1 Replication meets MHA
N:1 Replication meets MHAN:1 Replication meets MHA
N:1 Replication meets MHA
 
Php radomize
Php radomizePhp radomize
Php radomize
 
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editorセキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
 
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
 
Immortal
ImmortalImmortal
Immortal
 
Excel is image viewer
Excel is image viewerExcel is image viewer
Excel is image viewer
 
A bridge between php and ruby
A bridge between php and ruby A bridge between php and ruby
A bridge between php and ruby
 
Ruby and comparison_and...php
Ruby and comparison_and...phpRuby and comparison_and...php
Ruby and comparison_and...php
 

php and sapi and zendengine2 and...