Submit Search
Upload
php-src の歩き方
•
Download as PPTX, PDF
•
1 like
•
2,454 views
do_aki
Follow
PHP カンファレンス福岡 リジェクトコン で発表した資料
Read less
Read more
Technology
Report
Share
Report
Share
1 of 30
Download now
Recommended
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
JIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
Yoshio Hanawa
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
do_aki
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
Kenjiro Kubota
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
Recommended
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
JIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
Yoshio Hanawa
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
do_aki
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
Kenjiro Kubota
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
Php and threads ZTS
Php and threads ZTS
julien pauli
90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)
ryos36
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
ken_kitahara
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Go入門
Go入門
Takuya Ueda
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
sasezaki
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
30分で分かる!OSの作り方
30分で分かる!OSの作り方
uchan_nos
PHP の GC の話
PHP の GC の話
y-uti
社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた
Iosif Takakura
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介ver.2
Tsunenori Oohara
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
i_yudai
Phpをいじり倒す10の方法
Phpをいじり倒す10の方法
Moriyoshi Koizumi
Docker friendlyPHP / Laravel
Docker friendlyPHP / Laravel
Kentarou Takeda
PHPの今とこれから2023
PHPの今とこれから2023
Rui Hirokawa
Rpn and forth 超入門
Rpn and forth 超入門
Yoshitaka Seo
キメるClojure
キメるClojure
Yoshitaka Kawashima
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
Php in ruby
Php in ruby
do_aki
More Related Content
What's hot
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
Php and threads ZTS
Php and threads ZTS
julien pauli
90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)
ryos36
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
ken_kitahara
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Go入門
Go入門
Takuya Ueda
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
sasezaki
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
30分で分かる!OSの作り方
30分で分かる!OSの作り方
uchan_nos
PHP の GC の話
PHP の GC の話
y-uti
社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた
Iosif Takakura
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介ver.2
Tsunenori Oohara
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
i_yudai
Phpをいじり倒す10の方法
Phpをいじり倒す10の方法
Moriyoshi Koizumi
Docker friendlyPHP / Laravel
Docker friendlyPHP / Laravel
Kentarou Takeda
PHPの今とこれから2023
PHPの今とこれから2023
Rui Hirokawa
Rpn and forth 超入門
Rpn and forth 超入門
Yoshitaka Seo
キメるClojure
キメるClojure
Yoshitaka Kawashima
What's hot
(20)
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
Php and threads ZTS
Php and threads ZTS
90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Go入門
Go入門
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
Glibc malloc internal
Glibc malloc internal
30分で分かる!OSの作り方
30分で分かる!OSの作り方
PHP の GC の話
PHP の GC の話
社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介ver.2
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
Phpをいじり倒す10の方法
Phpをいじり倒す10の方法
Docker friendlyPHP / Laravel
Docker friendlyPHP / Laravel
PHPの今とこれから2023
PHPの今とこれから2023
Rpn and forth 超入門
Rpn and forth 超入門
キメるClojure
キメるClojure
Similar to php-src の歩き方
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
Php in ruby
Php in ruby
do_aki
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見る
shinjiigarashi
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法
Rui Hirokawa
Functions
Functions
do_aki
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
Hisateru Tanaka
2009 PHP初心者
2009 PHP初心者
Hideo Kashioka
Php development efficiency improvement
Php development efficiency improvement
伸幸 茂木
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
Rui Hirokawa
behatエクステンションの作り方
behatエクステンションの作り方
Ryo Tomidokoro
How to run P4 BMv2
How to run P4 BMv2
Kentaro Ebisawa
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
kenjis
はじめてのCodeIgniter
はじめてのCodeIgniter
Yuya Matsushima
PHPの今とこれから2020
PHPの今とこれから2020
Rui Hirokawa
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
Toru Tamaki
PSGIへの誘い
PSGIへの誘い
azuma satoshi
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
kenjis
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
Yohei Fushii
WordPressでの制作説明
WordPressでの制作説明
Toshiaki Endo
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!
KLab株式会社
Similar to php-src の歩き方
(20)
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Php in ruby
Php in ruby
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見る
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法
Functions
Functions
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
2009 PHP初心者
2009 PHP初心者
Php development efficiency improvement
Php development efficiency improvement
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
behatエクステンションの作り方
behatエクステンションの作り方
How to run P4 BMv2
How to run P4 BMv2
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
はじめてのCodeIgniter
はじめてのCodeIgniter
PHPの今とこれから2020
PHPの今とこれから2020
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
PSGIへの誘い
PSGIへの誘い
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
WordPressでの制作説明
WordPressでの制作説明
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!
More from do_aki
Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
do_aki
PHPとシグナル、その裏側
PHPとシグナル、その裏側
do_aki
再考:列挙型
再考:列挙型
do_aki
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
do_aki
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
do_aki
Writing php extensions in golang
Writing php extensions in golang
do_aki
php7's ast
php7's ast
do_aki
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
do_aki
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
do_aki
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
do_aki
20141017 introduce razor
20141017 introduce razor
do_aki
20141011 mastering mysqlnd
20141011 mastering mysqlnd
do_aki
php in ruby
php in ruby
do_aki
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
do_aki
N:1 Replication meets MHA
N:1 Replication meets MHA
do_aki
Php radomize
Php radomize
do_aki
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
do_aki
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
do_aki
Immortal
Immortal
do_aki
Excel is image viewer
Excel is image viewer
do_aki
More from do_aki
(20)
Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
PHPとシグナル、その裏側
PHPとシグナル、その裏側
再考:列挙型
再考:列挙型
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
Writing php extensions in golang
Writing php extensions in golang
php7's ast
php7's ast
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
20141017 introduce razor
20141017 introduce razor
20141011 mastering mysqlnd
20141011 mastering mysqlnd
php in ruby
php in ruby
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
N:1 Replication meets MHA
N:1 Replication meets MHA
Php radomize
Php radomize
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
Immortal
Immortal
Excel is image viewer
Excel is image viewer
Recently uploaded
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
taisei2219
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
Toru Tamaki
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
Toru Tamaki
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
Toru Tamaki
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
Recently uploaded
(14)
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
php-src の歩き方
1.
php-src の歩き方 2018/06/15 PHP Conference Fukuoka Reject
Conference do_aki
2.
@do_aki @do_aki http://do-aki.net/
3.
php-src • PHP 本体のソースコードが置かれているリポジトリの名前 –
主成分は C言語 • Chromium のソースコードの歩き方 (https://nhiroki.jp/2017/12/01/chromium-sourcecode) を 見て、これの PHP版を書こうと思った • というのを PHPの現場 (https://php-genba.shin1x1.com/17) で話したので、PHPカンファレンス福岡に応募した • 落選したのでリジェクトコンへ (今ここ)
4.
対象 php-src のコードを読んだことがない人
PHPの処理系や拡張がどのように実装されている か知りたい人 PHP言語は扱えるけど、C言語はあまり知らない人 php-src を読むきっかけになってくれれば
5.
あじぇんだ • ソースコードへのアクセス • ファイル配置 •
マクロ • (時間が余ったら)テスト
6.
ソースコードへのアクセス
7.
• http://git.php.net/ – php
本体、仕様、各種 pecl • https://github.com/php/ – github mirror – https://github.com/php/php-src (本体) – https://github.com/php/php-langspec (仕様) • http://php.net/downloads.php – tar ball – コンパイルする場合はこちらのほうが便利 • https://php-lxr.adamharvey.name/source/ – 検索したいときにはこちらを使うと便利
8.
PHP の 仕様
(php-langspec) • 元は、Facebook の中の人が作った言語仕様 • 現在は本家もこれに準拠 • 言語仕様を変える場合はこちらも修正される • https://github.com/php/php-langspec – 文法や構文 – メモリモデル – 名前空間 – クラスが満たすべき仕様 などなど
9.
ファイル配置
10.
ソースコード直下のディレクトリ構成 php-src/ + TSRM/ ZTS版用ライブラリ
(TS Resource Mgr) + Zend/ 主に Zend Engine + appveyor/ AppVeyor (Windows CI) 用ファイル + build/ PHP をビルドするために必要なスクリプト等 + ext/ バンドルされた 各種 Extension + main/ SAPI, Extension 共通の処理 + pear/ 現在は pear installer のみ + sapi/ 各種 SAPI モジュール + scripts/ phpt ジェネレータ, phpize + tests/ php 本体のテストコード (phpt) + travis/ Travis CI 用ファイル + win32/ Windows 環境互換用のコード - files readme 等 (ソースコードはなし)
11.
Zend ディレクトリ php-src/ - Zend/ +
tests/ Zend Engine のテストケース - LICENSE - Makefile.am ビルドのためのファイルがいくつか(大文字始まり) - Makefile.frag - ... - bench.php ベンチマークスクリプト。処理系のコードを変更した際 - micro_bench.php 性能劣化がないか調べるために利用されたり - zend.c - zend.h - zend.ico - zend_API.c - zend_API.h - zend_alloc.c - zend_alloc.h - ... 以下、ほぼすべてコード
12.
Zend ディレクトリ内のコードの主な内訳 PHP Script
Compiler Lexer (zend_language_scanner.l/.c) Parser (zend_language_parser.y/.c) AST Generator (zend_ast.c) Opcode Generator (zend_compile.c) MBCS Support (zend_multibyte.c) Memory Management Memory Allocator (zend_alloc.c) Cycles Collector (zend_gc.c) Virtual Machine Def (zend_vm_def.h,zend_vm_execute.skl) Gen (zend_vm_gen.php) zend_vm_execute.h/zend_execute.c/zend_exec ute_API.c/zend_vm_opcodes.c/zend_opcode.c Built-in objects Function (zend_builtin_functions.c) Class (zend_closures.c,zend_generators.c) Interface (zend_interfaces.c) Exception (zend_exceptions.c) zend_default_classes.c Data Structures & Algos HashTable (zend_hash.c) zend_string (zend_interfaces.c) Algorithm (zend_sort.c,zend_strtod.c) zend_list.c/zend_llist.c/zend_smart_str.c/zen d_smart_string.c/zend_stack.c/zend_ts_hash.c/ zend_stream.c/zend_ptr_stack.c (low level) Type & Op zend_types.h,zend_operators. c,zend_variables.c, zend_multiply.h, zend_long.h Others ini File Parser (zend_ini.c,zend_ini_parser.y,zend_ini_scanner.l) Signal Handling (zend_signal.c) Extension Management (zend_extensions.c) Constants (zend_constants.c) FPU Control (zend_float.c) DTrace Support (dtrace.c) CPU Arch (zend_cpuinfo.c) Highlight (zend_highlight.c) OOP zend_inheritance.c,zend_objects.c,zend_object_ handlers.c,zend_objects_API.c,zend_iteratos.c Core zend.c / zend_API.c
13.
sapi/main ディレクトリ php-src/ - main -
fastcgi.c FastCGI の実装(cgi/fpm) - getopt.c コマンドライン引数の処理 - output.c output buffering - php_variables.c GET/POSTパラメタ等の処理 - rfc1867.c file upload 処理 + stream/ stream wrapper - … - sapi + apache2handler/ mod_php + cgi/ CGI版 PHP (FastCGI もサポート) + cli/ CLI版 PHP (cli-server 含む) + embed/ 組み込み用PHP NGINX Unit でも使われてる + fpm/ PHP-FPM の主にプロセス管理部分 + litespeed/ LiteSpeed (LSAPI) PHP + phpdbg/ PHP 組み込みデバッガ main := 各SAPI が 共通して利用できる コード群
14.
ext ディレクトリ php-src/ - ext/ -
date/ + lib/ timelib ライブラリがバンドルされている + tests/ date 拡張の テスト - CREDITS メンテナのクレジット - config.w32 Windows ビルド用 - config0.m4 大抵は config.m4 これもビルド用 - php_date.c date拡張本体 - php_date.h date拡張定義 + opcache/ 各種環境ごとの実装や最適化の実装 + intl/ ICU本体を含まないものの構成要素が多いためファイル多い (C++) + json/ PHP独自のjson パーサ搭載 + mbstring/ libmbfl と oniguruma を同梱した重量級拡張 + mysqlnd/ libmysql 相当を独自に実装 + reflection/ php の class,function がどのような実装になっているかを知るのに便利 + skeleton/ このディレクトリだけ拡張ではない (拡張を作るためのひな形) + … ext 直下に各拡張のディレクトリがあり、その下は拡張によって異なる。 多くは date ディレクトリのように tests ディレクトリ + buildのためのファイル + 拡張の実装 (+ ラ イブラリをバンドル) という構成。 opcache,intl のように実装が複雑な場合はややファイルが多くなる
15.
ext/sapi -> main
-> Zend (->TSRM/win32) • PHP のコードは Zend / main / sapi / ext に加え、TSRM,win32 ですべて – TSRM は ZTS を実装するためのライブラリ – win32 は Windows 環境で動かすための互換コード • ext および sapi のコードは main あるいは Zend に依存, main のコードは Zend に依存 – 環境によってこれらは TSRM/win32 にも依存
16.
[TOPIC] 定義と実装 • C言語は
関数やデータ構造の定義 と 関数実装 を異なる ファイルに分離するのが一般的 • php-src においては – xxx.h(定義) xxx.c (実装) というファイル名 – 基本的にはすべて 定義と実装は同じディレクトリに配置されて いる – ex: Zend/zend_API.c Zend/zend_API.h • 他の言語実装だと include ディレクトリ という定義のみを まとめたディレクトリがあることが多い気がする
17.
マクロ
18.
C言語におけるマクロとは • プログラムを書き換える事前処理 • C言語の文法を無視して
文字列置換 が行われる – 駆使すると、見た目は全くC言語ではないコードにも なりうる • php-src で多用されてる – 独自マクロが読解できれば大体読める – 大文字のみで構成されたシンボルは大抵がマクロ
19.
定数定義 • この使い方だけなら php
の define と ほぼ同じ /* Zend/zend_vm_opcodes.h より抜粋 */ #define ZEND_NOP 0 #define ZEND_ADD 1 /* ext/opcache/Optimizer/nop_removal.c より抜粋 */ while (target->opcode == ZEND_NOP) { target--; } if (target == opline) { /* only NOPs */ opline->opcode = ZEND_NOP; }
20.
環境によって異なるコードを実行 • コード中どこにも #define
ZEND_WIN32 は記述されていないが、 Windows 環境でコンパイルする際には指定される – Windows の場合は OutputDebugString が、 それ以外では fprintf が 実行される。 – 通常の if と異なるのは、実行されないコードは存在自体がなくなるとい う点。 • デバッグ時のみ実行するコードを記述する際にもよく利用される – #if ZEND_DEBUG /* Zend/zend_alloc.c より抜粋 */ #ifdef ZEND_WIN32 OutputDebugString(output_buf); #else fprintf(stderr, "%s", output_buf); #endif
21.
関数に別名を付ける • _zend_hash_update 関数を
zend_hash_update という名前で コールできる – php-src の作法として、前者を直接利用するのは NG • デバッグ時に、呼び出し元のファイルや行を出力するための仕掛け – 通常の if と異なり、非デバッグ時性能低下がゼロ /* Zend/zend_hash.h より抜粋 */ #define zend_hash_update(ht, key, pData) _zend_hash_update(ht, key, pData ZEND_FILE_LINE_CC) /* Zend/zend_portability.h */ #if ZEND_DEBUG #define ZEND_FILE_LINE_C __FILE__, __LINE__ #define ZEND_FILE_LINE_CC , ZEND_FILE_LINE_C #else #define ZEND_FILE_LINE_C #define ZEND_FILE_LINE_CC #endif
22.
• コードの流れを追うだけなら、呼んでいる関数の実体がどのような関数で あるか ということさえわかっていれば十分 •
詳細を追いたいならば、どのように展開されるか まで知っておくと便利 /* ZEND_DEBUG が定義されている場合 */ _zend_hash_update(static_variables, var_name, var, __FILE__, __LINE__); /* ZEND_DEBUG が定義されていない場合 */ _zend_hash_update(static_variables, var_name, var); /* Zend/zend_closures.c より抜粋 */ void zend_closure_bind_var(zval *closure_zv, zend_string *var_name, zval *var) { zend_closure *closure = (zend_closure *) Z_OBJ_P(closure_zv); HashTable *static_variables = closure->func.op_array.static_variables; zend_hash_update(static_variables, var_name, var); }
23.
グローバル変数へのアクセスを隠蔽 • 有名どころだと EG
および CG マクロ – executor_globals あるいは compiler_globals というグローバル変数への アクセスを抽象化 – 拡張ごとに hogeG というグローバル変数が用意 されていることが多い (ex: GMPG,ZCG) – EG の利用例 • https://php- lxr.adamharvey.name/source/xref/PHP- 7.2/Zend/zend_builtin_functions.c#1371 • EG(class_table) に 定義済みのクラス名が格納され てる
24.
その他 知っておくと便利なマクロ • ZEND_FUNCTION(name)
/ PHP_FUNCTION(name) – これ自身は、 PHP の関数として登録するための呼び出し規約や引数を準備してくれ るもの – name がそのまま PHP の関数名であることが多い • ex: PHP_FUNCTION(is_array) • ZEND_METHOD(class_name, name) / PHP_METHOD(class_name, name) – クラスメソッド – ex: PHP_METHOD(DateTime, __construct) • ちなみに、 以下のように定義されてるのでそれぞれ同じです – /* main/php.h より抜粋 */ #define PHP_FUNCTION ZEND_FUNCTION #define PHP_METHOD ZEND_METHOD
25.
[TOPIC] 関数は拡張に属している • PHP
Script から呼び出し可能な組み込みの関数は、すべて なにかしらの拡張に属している – 拡張の一覧は get_loaded_extensions 関数で取得可能 – 指定した拡張に属する関数の一覧は get_extension_funcs 関 数で取得可能 – だいたい 拡張名 = ext直下のディレクトリ • core 拡張だけは特殊で Zend 以下にある – Zend/zend_builtin_functions.c – strlen, define 等
26.
テスト
27.
独自のテストハーネス • php-src 直下の
run-tests.php で実行 – make test で実行されるやつ • テスト実行時に ini 設定を上書きできる • 各テストケースは 各モジュールのディレクトリ 内に設置された tests ディレクトリに設置 • PHPT フォーマット (http://qa.php.net/write-test.php)
28.
php-src/tests/basic/001.phpt --TEST-- Trivial "Hello World"
test --FILE-- <?php echo "Hello World"?> --EXPECT-- Hello World テスト名称 テストコード (PHP スクリプト) 期待値 (出力)
29.
php-src/tests/basic/030.phpt --TEST-- Bug#55504 (Content-Type header
is not parsed correctly on HTTP POST request) --INI-- file_uploads=1 --POST_RAW-- Content-Type: multipart/form-data; boundary=BVoyv; charset=iso-8859-1 --BVoyv Content-Disposition: form-data; name="data" abc --BVoyv-- --FILE-- <?php var_dump($_POST); ?> --EXPECT-- array(1) { ["data"]=> string(3) "abc" } https://bugs.php.net/bug.php?id=55504 boundary が Content-Type の途中に来た場合、 セミコロンも boundary の一部として解釈されて いたために、適切に POSTデータを処理できていな かったバグ に対するテスト (php-5.5 で修正)
30.
以上
Download now