[PHP]hello worldの内部的な挙動を追ってみた

この投稿はPHP Advent Calendar 2013の16日目の記事です。

前の記事はk-motoyanさんの "PHPで気軽にテーブルスキーマをマイグレーションするツール - Qiita [キータ]" でした。

PHPのhello worldの内部的な挙動を追ってみた

PHPで、echo "hello" したときに内部の動きはどうなっているのか挙動を追ってみました。

gdbで内部の挙動を追いかける方法はこちらの記事を参考にしてください。
やってみよう!PHPの内部構造の動きをC言語レイヤーで見る方法
PHPで変数に値をセットしたときの内部的な挙動を見る

対象となるPHPのバージョンはこちら
https://github.com/php/php-src/tree/6a299514f82777094e8822a00293036ab8e1bb41

今回もEmacsのgdb機能を使って調査しました。
PHPのソースコードをコンパイルした後に、
M-x gdb
Run gdb (like this): gdb -i=mi ./sapi/cli/php
main関数にブレークポイントをしかけて
(gdb) b main
ワンライナーでPHPコードを実行
(gdb) run -r 'echo "hello"'
この後ひたすらstep実行を続けて、それっぽいところまできたらbacktrace
(gdb) bt
#0  sapi_flush () at /home/vagrant/src/php-src/main/SAPI.c:994
#1  0x000000000075f232 in php_output_op (op=0, str=0x7ffff7ed0d20 "hello", len=5) at /home/vagrant/src/php-src/main/output.c:1082
#2  0x000000000075d38a in php_output_write (str=0x7ffff7ed0d20 "hello", len=5) at /home/vagrant/src/php-src/main/output.c:255
#3  0x0000000000745d35 in php_output_wrapper (str=0x7ffff7ed0d20 "hello", str_length=5) at /home/vagrant/src/php-src/main/main.c:1870
#4  0x00000000007dc2a3 in zend_print_zval_ex (write_func=0x745d14 <php_output_wrapper>, expr=0x7ffff7fe6fc8, indent=0) at /home/vagrant/src/php-src/Zend/zen\
d.c:336
#5  0x00000000007dc21c in zend_print_zval (expr=0x7ffff7fe6fc8, indent=0) at /home/vagrant/src/php-src/Zend/zend.c:317
#6  0x00000000007db137 in zend_print_variable (var=0x7ffff7fe6fc8) at /home/vagrant/src/php-src/Zend/zend_variables.c:162
#7  0x0000000000827061 in ZEND_ECHO_SPEC_CONST_HANDLER (execute_data=0x7ffff7faf160) at /home/vagrant/src/php-src/Zend/zend_vm_execute.h:2193
#8  0x0000000000821f34 in execute_ex (execute_data=0x7ffff7faf160) at /home/vagrant/src/php-src/Zend/zend_vm_execute.h:363
#9  0x0000000000821fb7 in zend_execute (op_array=0x7ffff7fe5cb0) at /home/vagrant/src/php-src/Zend/zend_vm_execute.h:388
#10 0x00000000007ca928 in zend_eval_stringl (str=0xf27930 "echo \"hello\";", str_len=13, retval_ptr=0x0, string_name=0xc0479c "Command line code") at /home/\
vagrant/src/php-src/Zend/zend_execute_API.c:1200
#11 0x00000000007cabd2 in zend_eval_stringl_ex (str=0xf27930 "echo \"hello\";", str_len=13, retval_ptr=0x0, string_name=0xc0479c "Command line code", handle\
_exceptions=1) at /home/vagrant/src/php-src/Zend/zend_execute_API.c:1247
#12 0x00000000007cac5c in zend_eval_string_ex (str=0xf27930 "echo \"hello\";", retval_ptr=0x0, string_name=0xc0479c "Command line code", handle_exceptions=1\
) at /home/vagrant/src/php-src/Zend/zend_execute_API.c:1258
#13 0x00000000008928ea in do_cli (argc=3, argv=0xf278b0) at /home/vagrant/src/php-src/sapi/cli/php_cli.c:1034
#14 0x000000000089387a in main (argc=3, argv=0xf278b0) at /home/vagrant/src/php-src/sapi/cli/php_cli.c:1378
とまあこんな感じです。

ここから先は・・・きっとどなたかが解説してくれることでしょう!(他力本願)

明日はoasynnoumさんです。
カテゴリ:

人気記事