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

            2013/03/02
          闇PHP勉強会
               do_aki
@do_aki

http://do-aki.net/
immortal
[形]
1 死なない, 不死(身)の(⇔mortal).
2 不朽の;不滅の
3 永久の, 不変の
4 《生物》〈培養中の細胞が〉限りなく生長
[分裂]する.
不死身
<?php           sample
immortalize();
function I_will_be_back() {
  die("die!");
}
I_will_be_back();
print “alive!";
                    掲載のコードはイメージです
実装
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)
ZEND_API int
zend_set_user_opcode_handler(
 zend_uchar opcode,
 user_opcode_handler_t handler
)
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…
zend extension
               と
         php extension
• ロード時に探されるシンボルが異なる
 – zend : zend_extension_entry シンボル
 – php : get_module シンボル


• 大きな違いはないが、読み込まれるタイ
  ミングが違う
• zend_set_user_opcode_handler による
  opcode フックを実現するには、zend
  extension として呼び出される必要がある。
今後
• 事前に登録した phpの function を exit 時に
  コールするとか
• 例外起こしてみるとか

• ま、それ以前に、使い道探したいね
おしまい
おまけ
• GNU Global の話が出てきたので、htags の
  オススメのオプション

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

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

Immortal