【PHP】Zend Engine の内部を図示した記事・資料まとめ

# はじめに

C言語も英語も中国語も読めないPHP入門者です。
@tadsan さんの [PHPの実行時とコンパイル時](http://qiita.com/tadsan/items/f037095e7f07b54d3fea) を読んで、PHP内部でどのように処理されているのか全く理解していないことに気づきました。
理解するにはPHP内部のコードを読むのが一番かと思いますが、まだC言語は読めないので、Google検索とGoogle画像検索とGoogle翻訳を駆使して、PHP内部を図示したものを探しました。
探すだけでも結構な時間を費やしたので、見つけた記事・資料を共有することで、同じように考えている方の参考になればと思います。
C言語や英語が読めれば有用な記事は他にもあると思いますが、ここでは**図示されていること**を軸に記事・資料を紹介します。
紹介とか偉そうなことを言いましたが、コメントは小並感なので無視してください。

PHPの内部構造は複雑で、内部構造の全体ではなく、一部にフォーカスして説明されている記事もあります。
ここでは、下記のように大別して紹介します。
また、PHP5とPHP7では内部構造が異なりますが、区別しておりません。

+ ZendEngine 全体
+ ZendVirtualMachine（ZendLexer、ZendParser、ZendOPcode...）
+ ZendEngineCore（ZendVariables、ZendObjects、ZendHashTables...）

ここで紹介するリンク先の筆者の方々のお陰で理解が進みました。
わかりやすい記事・資料、ありがとうございます ((_ _ (´ω｀ )ﾍﾟｺ

この他に皆様のおすすめ記事・資料があれば、教えてください。
新しく図示された記事・資料を見つけたら追記したいと思います。

余談ですが、ZendEngineについて不明な点があり、teratailで質問をしたところ、@hnw さんから回答を頂きました。
ありがとうございます ((_ _ (´ω｀ )ﾍﾟｺ
同じように疑問に思った方の参考になればと思い、追記しておきます。

+ [PHP - PHP の内部構造（Zend Engine）について教えてください。(55152)｜teratail](https://teratail.com/questions/55152)

# ZendEngine 全体

##  [Quick tour of PHP from inside](http://www.slideshare.net/jpauli/quick-tour-of-php-from-inside)

ここまで Zend Engine 全体を図示したものはないと思います。
Zend Engine 全体について解説されている英語の記事です。
英語読める方なら、このスライドの [筆者](http://jpauli.github.io/about.html) の [ブログ](http://jpauli.github.io/) も参考になると思います。

![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/5bd17c58-75d2-686b-3b7c-63b21b0e87c0.jpeg)

引用元：[Quick tour of PHP from inside](http://www.slideshare.net/jpauli/quick-tour-of-php-from-inside)



##  [PHP による hello world 入門 | 東北ギーク](http://tech.respect-pal.jp/php-helloworld/)

`hello world` と記述したコードがどのように実行されるのか、非常に細かく解説されている日本語の記事です。

![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/c84a6258-ce93-952c-6e8a-95895bfadebd.jpeg)


引用元：[PHP による hello world 入門 | 東北ギーク](http://tech.respect-pal.jp/php-helloworld/)



## [PHP 5.5ネーティブキャッシュの話](http://www.slideshare.net/hirokawa/php-55-26227359)

リクエストからレスポンスまでの流れが非常にわかりやすい日本語の記事です。

![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/0051d793-5172-4098-74d8-12e4b12364d6.jpeg)


引用元：[PHP 5.5ネーティブキャッシュの話](http://www.slideshare.net/hirokawa/php-55-26227359)



## [Phpをいじり倒す10の方法](http://www.slideshare.net/moriyoshi/php10)

SAPI と ZendEngine と Extensinons について詳細に解説されている日本語の記事です。

![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/7467945c-bfcd-bcd2-e554-6649c9d0c065.jpeg)


引用元：[Phpをいじり倒す10の方法](http://www.slideshare.net/moriyoshi/php10)



## [php and sapi and zendengine2 and...](http://www.slideshare.net/do_aki/php-and-sapi-and-zendengine2-and)

PHP と SAPI と Zend Engine の関係についてわかりやすい日本語の記事です。

![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/a2eb317f-2cc7-384d-268b-24670d05bb3b.jpeg)


引用元：[php and sapi and zendengine2 and...](http://www.slideshare.net/do_aki/php-and-sapi-and-zendengine2-and)



## [PHP and Zend Internal I - 体系结构及生命周期](http://www.slideshare.net/ericzhangcn/php-and-zend-internal-i)

中国語ですが SAPI と PHP Core と ZendEngine の関係がわかりやすいです。

![006.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/2006bfd7-1075-328d-709d-50b5bb562c20.jpeg)


引用元：[PHP and Zend Internal I - 体系结构及生命周期](http://www.slideshare.net/ericzhangcn/php-and-zend-internal-i)



## [Internal php and gdb php core](http://www.slideshare.net/alpha86/internal-php-and-gdb-php-core)

中国語ですが SAPI と PHP Core と ZendEngine と Extensions の関係がわかりやすいです。

![007.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/777ce75c-4b2f-a23b-60f1-eabefa13788f.jpeg)


引用元：[Internal php and gdb php core](http://www.slideshare.net/alpha86/internal-php-and-gdb-php-core)




# ZendVirtualMachine（ZendLexer、ZendParser、ZendOPcode）

## [Php opcodes sep2008](http://sssslide.com/www.slideshare.net/bengiuliano/php-opcodes-sep2008)

Lexer や Parser、オペコードに関しての詳細を解説されている英語の記事です。
私が気になるオペコード周りについて超重要なことが書いてあると思うけど... I can't read English.

![008.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/dc1c2912-94a1-15c2-d05b-70f24a2ab7f3.jpeg)


引用元：[Php opcodes sep2008](http://sssslide.com/www.slideshare.net/bengiuliano/php-opcodes-sep2008)



## [PHP AST 徹底解説](http://www.slideshare.net/do_aki/php-ast)

PHP7から追加されたAST（抽象構文木）について非常にわかりやすい解説されている日本語の記事です。
字句解析、構文解析、オペコードの解説もあります。

![009.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/c767d8e8-0e7c-5394-ae3e-0afa5b83c1f6.jpeg)

引用元：[PHP AST 徹底解説](http://www.slideshare.net/do_aki/php-ast)



## [Zend OPcacheの速さの秘密を探る](http://www.slideshare.net/hnw/zend-opcache)

@hnw さんのスライドですが、Lexer から Zend VM までの流れが非常にわかりやすい日本語の記事です。

![010.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/66bb1902-f12d-276f-40b5-aee078eb61dc.jpeg)

引用元： [Zend OPcacheの速さの秘密を探る](http://www.slideshare.net/hnw/zend-opcache)


# ZendEngineCore（ZendVariables、ZendObjects、ZendHashTables）

## [Forum PHP 2007 - Paris, France](https://derickrethans.nl/talks/php-secrets-forum7.pdf)

英語の記事ですが、シンボルテーブルとZvalの関係が非常にわかりやすいです。
参照時のシンボルテーブルの動きは複雑ですが、ここを見れば理解できると思います。

![011.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/697d8e02-3b7c-293f-8573-d7413be0310c.jpeg)

引用元：[Forum PHP 2007 - Paris, France](https://derickrethans.nl/talks/php-secrets-forum7.pdf)


## [PHPの配列管理方法を正しく理解する-ハッシュテーブルとZval](http://www.cpa-lab.com/tech/031)

シンボルテーブルとZval、ハッシュテーブルの関係が非常にわかりやすく解説されている日本語の記事です。

![012.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/37a362d6-26b5-8260-c523-177ce98efb08.jpeg)

引用元：[PHPの配列管理方法を正しく理解する-ハッシュテーブルとZval](http://www.cpa-lab.com/tech/031)


## [PHPのデータ構造](http://d.hatena.ne.jp/yokkuns/20090614/1244994082)

シンボルテーブル、zval、ハッシュテーブルの関係が非常にわかりやすい日本語の記事です。

![013.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/4e197061-0e87-ca47-286c-054971b51841.jpeg)


引用元：[PHPのデータ構造](http://d.hatena.ne.jp/yokkuns/20090614/1244994082)



## [The secret of PHP7's Performance](http://www.slideshare.net/laruence/the-secret-of-php7s-performance)

英語の記事ですが、Zvalとハッシュテーブル、シンボルテーブルについて非常にわかりやすいです。
PHP5とPHP7でどのように変わったかもわかりやすく図示されています。

![014.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/050a3d1c-a21a-9f05-3b1a-5cdfa670c8a1.jpeg)


引用元：[The secret of PHP7's Performance](http://www.slideshare.net/laruence/the-secret-of-php7s-performance)


## [PHP7で変わること ——言語仕様とエンジンの改善ポイント](http://www.slideshare.net/hnw/phpcon-kansai20150530)

@hnw さんのスライドですが、PHP5とPHP7でzvalがどのように変わったのか、わかりやすく解説されている日本語の記事です。

![015.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/c473692c-995e-cf01-8c62-61c163960bf6.jpeg)

引用元：[PHP7で変わること ——言語仕様とエンジンの改善ポイント](http://www.slideshare.net/hnw/phpcon-kansai20150530)

# その他

文章やコードがメインだけど、参考になりそうな記事も載せておきます。

#### 日本語

+ [知っていますか？ あなたの書いたPHPのコードが実行される4つのプロセス - WPJ](https://www.webprofessional.jp/how-php-executes-from-source-code-to-render/)
+ [PHP7における内部値の表現―パート1 : PHP5とPHP7のzvalの仕組み | プログラミング | POSTD](http://postd.cc/internal-value-representation-in-php-7-part-1/)
+ [PHP Internals Book 日本語訳](http://phpinternalsbook-ja.com/)
+ [PHP 'foreach' の内部挙動について](http://ja.stackoverflow.com/questions/5770/php-foreach-%E3%81%AE%E5%86%85%E9%83%A8%E6%8C%99%E5%8B%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
+ [HashTable と HashDos](http://www.slideshare.net/taketyan/hash-table-hashdos)
+ [phpの配列はどのようにして初期化され実行されるのか](http://zudoh.com/archives/218)
+ [ZendEngine勉強会で「拡張ライブラリでなるべく簡単に構文を追加する方法」というタイトルで喋ってきました](http://blog.asial.co.jp/809)
+ [PHPは代入と参照の違い](http://d.hatena.ne.jp/bravewood/20130307)
+ [func_get_args系の関数の変な動きから、EG(argument_stack)を中途半端に眺める](http://d.hatena.ne.jp/i_ogi/20070701/1183288229)
+ [第三回闇PHP勉強会開催した&PHPカンファレンスとPHPMatsuriで喋った](http://blog.anatoo.jp/entry/20121124/1353692635)
+ [PHPをハックしよう(第二回)](http://backflip180.jp/tech/php-hack-2.html)
+ [QIQの設計と実装 - 讃容日記](http://d.hatena.ne.jp/rsky/20080301/1204326365)
+ [PHPのソースを読もう てきめんのPHPソース追っかけ冒険記 PHP Advent Calendar 2015 11日目 - てきとうなさいと。べぇたばん](http://tekitoh-memdhoi.info/views/704)

#### 英語

+ [PHP 7 Virtual Machine](http://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.html)
+ [PHP Internals Book](http://www.phpinternalsbook.com/)
+ [Building a simple Parser and Lexer in PHP](http://www.codediesel.com/php/building-a-simple-parser-and-lexer-in-php/)
+ [Still trying to get it all out: Understanding Opcodes](http://blog.golemon.com/2008/01/understanding-opcodes.html)
+ [Zend Engine | Code with Music](http://abhinavsingh.com/tag/zend-engine/)

# note

note でも記事を公開してるので、興味がある方はご覧ください。

・[【初学者向けコードリーディング】 PHP の TODO アプリのコードを一緒に読み解こう](https://note.mu/7968/n/n46a8beb87c93)