おぎろぐはてブロスマートフォン用の表示で見るおぎろぐはてブロなんだかんだエンジニアになって10年以上この広告は、90日以上更新していないブログに表示しています。PECLちょっと、以前からやってみたいネタがあって、その関連でPECLのintercept拡張モジュールをいじってみます。最近は、ネタだけ貯めてあまり書いてないですけどねぇ。懲りずに役に立たないネタ書いていきます。intercept指定した関数、メソッドが呼び出された前後に登録した関数を呼び出すことのできるモジュールです。id:shimookaさんのとこのhttp://www.doyouphp.jp/tips/tips_intercept.shtmlので書かれているので、使い方については省略。機能が限定されているので、すごく簡単です。ダメなところ既にメンテされていないようで、コンセプトはおもしろいのですが、イケてないところが多い。(いじれない)戻り値をいじれないところが、個人的に不足しています。(上の2つはTODOに書かれていますが、メンテされてないので。)コードを読んでみましょうCVSから、ソースコードを読んでみます。(それでも冗長な部分も多い気がしますが)実体は、intercept.cです。MINIT_FUNCTIONで設定されています。zend_executeと、zend_execute_internalを自前のものに差し替えています。格納した本来の処理を呼び出す前後にinterceptの関数呼び出しを差し込むことで、interceptを可能としています。いう理由で棲み分けられているのかは知らないですが、ユーザ定義関数はzend_execute、組み込み関数はinternalが利用されます。スクリプト実行時に最初にzend_executeが呼ばれるみたいです。zend_executeとzend_execute_internalでは引数も異なっています。intercept対象の登録処理ここは、単に呼び出せる関数かをチェックして、hashに詰めてるだけなので省略。zend_executeのフック関数名さえとれればこっちのもんですよという感じ。軽くコメント付けてみます。efree(fname);}zend_execute_internalのフックzend_executeと引数が違うことに注意。return_value_usedというのは、戻り値が関数を実行後に利用するかどうかのフラグです。参照用関数がrunkitで提供されてますね。(どういう条件で発生するんだろ。以下intercept_execute()と同じなので省略}***関数名の取得部apd_get_active_function_name()から拝借したよとのこと。そのため結構冗長です。funcname;}intercept時に関数名を渡すようにするここからいろいろ手を入れていきます。関数名を渡すようにします。call_user_functionの引数に詰めるだけです。zval_dtor(args[0]);元々のコードが無駄が多く、不必要に変数を初期化していたので、そこに乗っかります。args[0]のMAKE_STD_ZVAL()の後に、関数名をセットします。引数から関数名を取れていることが分かります。次は「pre-intercept時に引数を捕まえるようにする」です。これはきっと、これで実装すればいい気がする。entriesはてなブログをはじめよう!i_ogiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。