Submit Search
Upload
php-src の歩き方
•
Download as PPTX, PDF
•
1 like
•
2,456 views
do_aki
Follow
PHP カンファレンス福岡 リジェクトコン で発表した資料
Read less
Read more
Technology
Report
Share
Report
Share
1 of 30
Download now
Recommended
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
do_aki
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
GoによるiOSアプリの開発
GoによるiOSアプリの開発
Takuya Ueda
こわくない Git
こわくない Git
Kota Saito
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
Rpn and forth 超入門
Rpn and forth 超入門
Yoshitaka Seo
Recommended
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
do_aki
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
GoによるiOSアプリの開発
GoによるiOSアプリの開発
Takuya Ueda
こわくない Git
こわくない Git
Kota Saito
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
Rpn and forth 超入門
Rpn and forth 超入門
Yoshitaka Seo
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
Git flowの活用事例
Git flowの活用事例
Hirohito Kato
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
Yukinori KITADAI
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
Masahiro Sakai
Quine・難解プログラミングについて
Quine・難解プログラミングについて
mametter
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
LLVM最適化のこつ
LLVM最適化のこつ
MITSUNARI Shigeo
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
JIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Masakazu Matsushita
Docker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
Takateru Yamagishi
がんばれ PHP Fiber
がんばれ PHP Fiber
infinite_loop
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
Kohei Nakamura
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
Daisuke Morishita
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
Ito Takayuki
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
Php in ruby
Php in ruby
do_aki
More Related Content
What's hot
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
Git flowの活用事例
Git flowの活用事例
Hirohito Kato
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
Yukinori KITADAI
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
Masahiro Sakai
Quine・難解プログラミングについて
Quine・難解プログラミングについて
mametter
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
LLVM最適化のこつ
LLVM最適化のこつ
MITSUNARI Shigeo
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
JIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Masakazu Matsushita
Docker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
Takateru Yamagishi
がんばれ PHP Fiber
がんばれ PHP Fiber
infinite_loop
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
Kohei Nakamura
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
Daisuke Morishita
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
Ito Takayuki
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
What's hot
(20)
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Git flowの活用事例
Git flowの活用事例
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
Quine・難解プログラミングについて
Quine・難解プログラミングについて
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
LLVM最適化のこつ
LLVM最適化のこつ
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Redisの特徴と活用方法について
Redisの特徴と活用方法について
JIT のコードを読んでみた
JIT のコードを読んでみた
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Docker Tokyo
Docker Tokyo
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
がんばれ PHP Fiber
がんばれ PHP Fiber
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
Glibc malloc internal
Glibc malloc internal
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
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
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
Hiroshi Tomioka
Recently uploaded
(9)
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
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