Immortal

15
immortal とととととととととととととととととと 2013/03/02 と PHP ととと do_aki

description

 

Transcript of Immortal

Page 1: Immortal

immortalというモジュールを作ろうとしている話

2013/03/02闇 PHP 勉強会

do_aki

Page 2: Immortal

@do_aki

http://do-aki.net/

Page 3: Immortal

immortal

[ 形 ]1 死なない , 不死(身)の(⇔ mortal ) .2 不朽の;不滅の3 永久の , 不変の4 《生物》〈培養中の細胞が〉限りなく生長[分裂]する .

Page 4: Immortal

不死身

Page 5: Immortal

sample<?phpimmortalize();function I_will_be_back() { die("die!");}I_will_be_back();print “alive!";

掲載のコードはイメージです

Page 6: Immortal

実装

Page 7: Immortal

zend_set_user_opcode_handlerで ZEND_EXIT をフック

• zend_set_user_opcode_handler opcode => opcode の実行をフックできる関数   (Zend/zend_execute.c)

• ZEND_EXIT=> exit および die の opcode   (Zend/zend_vm_opcodes.h)

Page 8: Immortal

ZEND_API int zend_set_user_opcode_handler( zend_uchar opcode, user_opcode_handler_t handler)

Page 9: Immortal

user_opcode_handler_t

• zend_execute_data *execute_data を引数にとって、 int を返す関数型

• 戻り値の int は Zend/zend_execute.h で定義された値– ZEND_USER_OPCODE_CONTINUE– ZEND_USER_OPCODE_RETURN– ZEND_USER_OPCODE_DISPATCH

etc…

Page 10: Immortal

zend extensionと

php extension• ロード時に探されるシンボルが異なる– zend : zend_extension_entry シンボル – php : get_module シンボル

• 大きな違いはないが、読み込まれるタイミングが違う

Page 11: Immortal

• zend_set_user_opcode_handler による opcode フックを実現するには、 zend extension として呼び出される必要がある。

Page 12: Immortal

今後

Page 13: Immortal

• 事前に登録した php の function を exit 時にコールするとか

• 例外起こしてみるとか

• ま、それ以前に、使い道探したいね

Page 14: Immortal

おしまい

Page 15: Immortal

おまけ• GNU Global の話が出てきたの

で、 htags のオススメのオプション

• htags -Faghnsv --tree-view --show-position –fD

• サーバに cgi 置いて検索できるようにしておくとすんげー便利