はじめに
C言語も英語も中国語も読めないPHP入門者です。
@tadsan さんの PHPの実行時とコンパイル時 を読んで、PHP内部でどのように処理されているのか全く理解していないことに気づきました。
理解するにはPHP内部のコードを読むのが一番かと思いますが、まだC言語は読めないので、Google検索とGoogle画像検索とGoogle翻訳を駆使して、PHP内部を図示したものを探しました。
探すだけでも結構な時間を費やしたので、見つけた記事・資料を共有することで、同じように考えている方の参考になればと思います。
C言語や英語が読めれば有用な記事は他にもあると思いますが、ここでは図示されていることを軸に記事・資料を紹介します。
紹介とか偉そうなことを言いましたが、コメントは小並感なので無視してください。
PHPの内部構造は複雑で、内部構造の全体ではなく、一部にフォーカスして説明されている記事もあります。
ここでは、下記のように大別して紹介します。
また、PHP5とPHP7では内部構造が異なりますが、区別しておりません。
- ZendEngine 全体
- ZendVirtualMachine(ZendLexer、ZendParser、ZendOPcode...)
- ZendEngineCore(ZendVariables、ZendObjects、ZendHashTables...)
ここで紹介するリンク先の筆者の方々のお陰で理解が進みました。
わかりやすい記事・資料、ありがとうございます ((_ _ (´ω` )ペコ
この他に皆様のおすすめ記事・資料があれば、教えてください。
新しく図示された記事・資料を見つけたら追記したいと思います。
余談ですが、ZendEngineについて不明な点があり、teratailで質問をしたところ、@hnw さんから回答を頂きました。
ありがとうございます ((_ _ (´ω` )ペコ
同じように疑問に思った方の参考になればと思い、追記しておきます。
ZendEngine 全体
Quick tour of PHP from inside
ここまで Zend Engine 全体を図示したものはないと思います。
Zend Engine 全体について解説されている英語の記事です。
英語読める方なら、このスライドの 筆者 の ブログ も参考になると思います。
引用元:Quick tour of PHP from inside
PHP による hello world 入門 | 東北ギーク
hello world
と記述したコードがどのように実行されるのか、非常に細かく解説されている日本語の記事です。
引用元:PHP による hello world 入門 | 東北ギーク
PHP 5.5ネーティブキャッシュの話
リクエストからレスポンスまでの流れが非常にわかりやすい日本語の記事です。
Phpをいじり倒す10の方法
SAPI と ZendEngine と Extensinons について詳細に解説されている日本語の記事です。
引用元:Phpをいじり倒す10の方法
php and sapi and zendengine2 and...
PHP と SAPI と Zend Engine の関係についてわかりやすい日本語の記事です。
引用元:php and sapi and zendengine2 and...
PHP and Zend Internal I - 体系结构及生命周期
中国語ですが SAPI と PHP Core と ZendEngine の関係がわかりやすいです。
引用元:PHP and Zend Internal I - 体系结构及生命周期
Internal php and gdb php core
中国語ですが SAPI と PHP Core と ZendEngine と Extensions の関係がわかりやすいです。
引用元:Internal php and gdb php core
ZendVirtualMachine(ZendLexer、ZendParser、ZendOPcode)
Php opcodes sep2008
Lexer や Parser、オペコードに関しての詳細を解説されている英語の記事です。
私が気になるオペコード周りについて超重要なことが書いてあると思うけど... I can't read English.
PHP AST 徹底解説
PHP7から追加されたAST(抽象構文木)について非常にわかりやすい解説されている日本語の記事です。
字句解析、構文解析、オペコードの解説もあります。
引用元:PHP AST 徹底解説
Zend OPcacheの速さの秘密を探る
@hnw さんのスライドですが、Lexer から Zend VM までの流れが非常にわかりやすい日本語の記事です。
ZendEngineCore(ZendVariables、ZendObjects、ZendHashTables)
Forum PHP 2007 - Paris, France
英語の記事ですが、シンボルテーブルとZvalの関係が非常にわかりやすいです。
参照時のシンボルテーブルの動きは複雑ですが、ここを見れば理解できると思います。
引用元:Forum PHP 2007 - Paris, France
PHPの配列管理方法を正しく理解する-ハッシュテーブルとZval
シンボルテーブルとZval、ハッシュテーブルの関係が非常にわかりやすく解説されている日本語の記事です。
引用元:PHPの配列管理方法を正しく理解する-ハッシュテーブルとZval
PHPのデータ構造
シンボルテーブル、zval、ハッシュテーブルの関係が非常にわかりやすい日本語の記事です。
引用元:PHPのデータ構造
The secret of PHP7's Performance
英語の記事ですが、Zvalとハッシュテーブル、シンボルテーブルについて非常にわかりやすいです。
PHP5とPHP7でどのように変わったかもわかりやすく図示されています。
引用元:The secret of PHP7's Performance
PHP7で変わること ——言語仕様とエンジンの改善ポイント
@hnw さんのスライドですが、PHP5とPHP7でzvalがどのように変わったのか、わかりやすく解説されている日本語の記事です。
引用元:PHP7で変わること ——言語仕様とエンジンの改善ポイント
その他
文章やコードがメインだけど、参考になりそうな記事も載せておきます。
日本語
- 知っていますか? あなたの書いたPHPのコードが実行される4つのプロセス - WPJ
- PHP7における内部値の表現―パート1 : PHP5とPHP7のzvalの仕組み | プログラミング | POSTD
- PHP Internals Book 日本語訳
- PHP 'foreach' の内部挙動について
- HashTable と HashDos
- phpの配列はどのようにして初期化され実行されるのか
- ZendEngine勉強会で「拡張ライブラリでなるべく簡単に構文を追加する方法」というタイトルで喋ってきました
- PHPは代入と参照の違い
- func_get_args系の関数の変な動きから、EG(argument_stack)を中途半端に眺める
- 第三回闇PHP勉強会開催した&PHPカンファレンスとPHPMatsuriで喋った
- PHPをハックしよう(第二回)
- QIQの設計と実装 - 讃容日記
- PHPのソースを読もう てきめんのPHPソース追っかけ冒険記 PHP Advent Calendar 2015 11日目 - てきとうなさいと。べぇたばん
英語
- PHP 7 Virtual Machine
- PHP Internals Book
- Building a simple Parser and Lexer in PHP
- Still trying to get it all out: Understanding Opcodes
- Zend Engine | Code with Music
note
note でも記事を公開してるので、興味がある方はご覧ください。