SlideShare a Scribd company logo
1 of 30
php-src
の歩き方
2018/06/15
PHP Conference Fukuoka
Reject Conference
do_aki
@do_aki
@do_aki
http://do-aki.net/
php-src
• PHP 本体のソースコードが置かれているリポジトリの名前
– 主成分は C言語
• Chromium のソースコードの歩き方
(https://nhiroki.jp/2017/12/01/chromium-sourcecode) を
見て、これの PHP版を書こうと思った
• というのを PHPの現場 (https://php-genba.shin1x1.com/17)
で話したので、PHPカンファレンス福岡に応募した
• 落選したのでリジェクトコンへ (今ここ)
対象
 php-src のコードを読んだことがない人
 PHPの処理系や拡張がどのように実装されている
か知りたい人
 PHP言語は扱えるけど、C言語はあまり知らない人
 php-src を読むきっかけになってくれれば
あじぇんだ
• ソースコードへのアクセス
• ファイル配置
• マクロ
• (時間が余ったら)テスト
ソースコードへのアクセス
• 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/
– 検索したいときにはこちらを使うと便利
PHP の 仕様 (php-langspec)
• 元は、Facebook の中の人が作った言語仕様
• 現在は本家もこれに準拠
• 言語仕様を変える場合はこちらも修正される
• https://github.com/php/php-langspec
– 文法や構文
– メモリモデル
– 名前空間
– クラスが満たすべき仕様 などなど
ファイル配置
ソースコード直下のディレクトリ構成
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 等 (ソースコードはなし)
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
- ... 以下、ほぼすべてコード
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
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 が
共通して利用できる
コード群
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 のように実装が複雑な場合はややファイルが多くなる
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 にも依存
[TOPIC] 定義と実装
• C言語は 関数やデータ構造の定義 と 関数実装 を異なる
ファイルに分離するのが一般的
• php-src においては
– xxx.h(定義) xxx.c (実装) というファイル名
– 基本的にはすべて 定義と実装は同じディレクトリに配置されて
いる
– ex: Zend/zend_API.c Zend/zend_API.h
• 他の言語実装だと include ディレクトリ という定義のみを
まとめたディレクトリがあることが多い気がする
マクロ
C言語におけるマクロとは
• プログラムを書き換える事前処理
• C言語の文法を無視して 文字列置換 が行われる
– 駆使すると、見た目は全くC言語ではないコードにも
なりうる
• php-src で多用されてる
– 独自マクロが読解できれば大体読める
– 大文字のみで構成されたシンボルは大抵がマクロ
定数定義
• この使い方だけなら 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;
}
環境によって異なるコードを実行
• コード中どこにも #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
関数に別名を付ける
• _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
• コードの流れを追うだけなら、呼んでいる関数の実体がどのような関数で
あるか ということさえわかっていれば十分
• 詳細を追いたいならば、どのように展開されるか まで知っておくと便利
/* 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);
}
グローバル変数へのアクセスを隠蔽
• 有名どころだと 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) に 定義済みのクラス名が格納され
てる
その他 知っておくと便利なマクロ
• 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
[TOPIC] 関数は拡張に属している
• PHP Script から呼び出し可能な組み込みの関数は、すべて
なにかしらの拡張に属している
– 拡張の一覧は get_loaded_extensions 関数で取得可能
– 指定した拡張に属する関数の一覧は get_extension_funcs 関
数で取得可能
– だいたい 拡張名 = ext直下のディレクトリ
• core 拡張だけは特殊で Zend 以下にある
– Zend/zend_builtin_functions.c
– strlen, define 等
テスト
独自のテストハーネス
• php-src 直下の run-tests.php で実行
– make test で実行されるやつ
• テスト実行時に ini 設定を上書きできる
• 各テストケースは 各モジュールのディレクトリ
内に設置された tests ディレクトリに設置
• PHPT フォーマット
(http://qa.php.net/write-test.php)
php-src/tests/basic/001.phpt
--TEST--
Trivial "Hello World" test
--FILE--
<?php echo "Hello World"?>
--EXPECT--
Hello World
テスト名称
テストコード
(PHP スクリプト)
期待値 (出力)
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 で修正)
以上

More Related Content

What's hot

C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
Php and threads ZTS
Php and threads ZTSPhp and threads ZTS
Php and threads ZTSjulien pauli
 
90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)ryos36
 
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎ken_kitahara
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。sasezaki
 
30分で分かる!OSの作り方
30分で分かる!OSの作り方30分で分かる!OSの作り方
30分で分かる!OSの作り方uchan_nos
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話y-uti
 
社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみたIosif Takakura
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようShohei Okada
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたYoshio Hanawa
 
Elixirと他言語の比較的紹介 ver.2
Elixirと他言語の比較的紹介ver.2Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介 ver.2Tsunenori Oohara
 
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをOSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをi_yudai
 
Phpをいじり倒す10の方法
Phpをいじり倒す10の方法Phpをいじり倒す10の方法
Phpをいじり倒す10の方法Moriyoshi Koizumi
 
Docker friendly PHP / Laravel
Docker friendlyPHP / LaravelDocker friendlyPHP / Laravel
Docker friendly PHP / LaravelKentarou Takeda
 
PHPの今とこれから2023
PHPの今とこれから2023PHPの今とこれから2023
PHPの今とこれから2023Rui Hirokawa
 
Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門Yoshitaka Seo
 

What's hot (20)

C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
Php and threads ZTS
Php and threads ZTSPhp and threads ZTS
Php and threads ZTS
 
90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)
 
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
Go入門
Go入門Go入門
Go入門
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
30分で分かる!OSの作り方
30分で分かる!OSの作り方30分で分かる!OSの作り方
30分で分かる!OSの作り方
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
 
Elixirと他言語の比較的紹介 ver.2
Elixirと他言語の比較的紹介ver.2Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介 ver.2
 
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをOSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
 
Phpをいじり倒す10の方法
Phpをいじり倒す10の方法Phpをいじり倒す10の方法
Phpをいじり倒す10の方法
 
Docker friendly PHP / Laravel
Docker friendlyPHP / LaravelDocker friendlyPHP / Laravel
Docker friendly PHP / Laravel
 
PHPの今とこれから2023
PHPの今とこれから2023PHPの今とこれから2023
PHPの今とこれから2023
 
Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門
 
キメるClojure
キメるClojureキメるClojure
キメるClojure
 

Similar to php-src の歩き方

WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るPHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るshinjiigarashi
 
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法スクリプト言語PHP攻略法
スクリプト言語PHP攻略法Rui Hirokawa
 
Functions
FunctionsFunctions
Functionsdo_aki
 
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjPhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjHisateru Tanaka
 
Php development efficiency improvement
Php development efficiency improvementPhp development efficiency improvement
Php development efficiency improvement伸幸 茂木
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)Rui Hirokawa
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方Ryo Tomidokoro
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
PHPの今とこれから2020
PHPの今とこれから2020PHPの今とこれから2020
PHPの今とこれから2020Rui Hirokawa
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドToru Tamaki
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoyakenjis
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!Yohei Fushii
 
WordPressでの制作説明
WordPressでの制作説明WordPressでの制作説明
WordPressでの制作説明Toshiaki Endo
 
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!KLab株式会社
 

Similar to php-src の歩き方 (20)

WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るPHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見る
 
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法スクリプト言語PHP攻略法
スクリプト言語PHP攻略法
 
Functions
FunctionsFunctions
Functions
 
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjPhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
 
2009 PHP初心者
2009 PHP初心者2009 PHP初心者
2009 PHP初心者
 
Php development efficiency improvement
Php development efficiency improvementPhp development efficiency improvement
Php development efficiency improvement
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
 
behatエクステンションの作り方
behatエクステンションの作り方behatエクステンションの作り方
behatエクステンションの作り方
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
PHPの今とこれから2020
PHPの今とこれから2020PHPの今とこれから2020
PHPの今とこれから2020
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
 
PSGIへの誘い
PSGIへの誘いPSGIへの誘い
PSGIへの誘い
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
WordPressでの制作説明
WordPressでの制作説明WordPressでの制作説明
WordPressでの制作説明
 
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!
 

More from do_aki

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

More from do_aki (20)

Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
 
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
 
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golang
 
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
 

Recently uploaded

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介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...論文紹介: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論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田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論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~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クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介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...論文紹介: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論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の 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...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 

php-src の歩き方

  • 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 を読むきっかけになってくれれば
  • 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 – 文法や構文 – メモリモデル – 名前空間 – クラスが満たすべき仕様 などなど
  • 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 ディレクトリ という定義のみを まとめたディレクトリがあることが多い気がする
  • 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 等
  • 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 で修正)