PHP拡張作成点滴テクニック収集

2507 ワード

赤い部分は私の注釈です.
詳細は以下を参照してください.
1.よく使われる汎用機能はzen_のようにパッケージ化されています.API.hヘッダファイルでは、内部の詳細を簡単に見ることができ、時間を無駄にします.(参考:Extending and Embedding PHPの付録A)
2.terminalでテストプログラムを実行すると、メモリ漏洩の問題を解決するために特に重要な拡張された内部エラー出力が表示されます.(debugのlibをコンパイル)
3.開発中にMakefileの「CFLAGS=-g-O 2」を修正し、最適化オプションを削除し、-Wallと-pedanticを追加し、デバッグとコンパイル警告の表示を容易にする.
4.あるzval*は、strvalがコピーされていないため、zval_は使用できません.ptr_dtor(zval**)、efree(void*)を使います.
5.terminalの$SERVER['PWD']は値がありますがzend_を通過できませんgetenv()は、この値が意味がないか信頼できないため取得されます.
6.INTERNAL_を使用してエクスポート関数を呼び出すFUNCTION_PARAM_PASTHRU伝参;宣言された非エクスポート関数はINTERNAL_FUNCTION_PARAMは「導出関数」のパラメータを使用します.
7.注意:RETURN_TYPEは、分割やループなどを選択する際に、括弧の中に入れることが望ましい、
あるいはセミコロンを使わないでください:#define RETURN_BOOL(b) { RETVAL_BOOL(b); return; }.
8.関数のパラメータが参照され、スカラーでない場合は、メモリの漏洩を防ぐために、まずプロファイルを作成します.
9.異常を放出する前に、EG(exception)に異常があるかどうかを判断したほうがいい.そうしないとメモリが漏れる.
10.WebサーバAPIがISAPI(IIS)である場合、zend_getenv関数は機能しません.
11.zend_へstack_push()はデータポインタを入力し、実際に格納(copy)するのはそのポインタが指すデータであり、言い換えれば、格納すべきデータのポインタである.
ZEND_API int zend_stack_push(zend_stack *stack, void *element, int size);
ZEND_API int zend_stack_top(zend_stack *stack, void **element);
ここで、size==sizeof(*element);
同様にzend_hashもそうですzend_を比較しますhash_updateとzend_hash_find.
12.add_の使用assoc_zval(HashTable*,const char*,zval*)はzval*ではなくzval*を格納しているので、
ユーザーが入力したパラメータを格納するときは、新しいzvalをコピーしておく必要があります.そうしないと、予想できないことが起こります.
13.zval_dtor(zval*)変数とその内部の参照メモリを解放し、zval_ptr_dtor(zval**)まずrefcountをチェック
zvalを呼び出すかどうかを決定します.dtor(zval*),zval_copy_dtor(zval*)深層コピーのみ、すなわちコピーのみを実行
zvalをコピーせずに内部参照メモリを作成します.
14.VCを使用してwinのダイナミックリンクライブラリをコンパイルし、コードにzend関数(zend_など)を呼び出した場合getenv、zend.hでは、以下のように定義される.
extern "C"{
extern ZEND_API char *(*zend_getenv)(char *name, size_t name_len TSRMLS_DC);
}
ZEND_を使用するには、この関数を導入する必要があります.API、事前にLIBZENDをキャンセルする必要がありますEXPORTS(VC「設定」の前処理定義を含む)またはZEND_を使用するDLIMPORT,
ZEND_DLIMPORT char *(*zend_getenv)(char *name, size_t name_len TSRMLS_DC);
以下から:zend_config.w32.h
 
  
#ifdef LIBZEND_EXPORTS
# define ZEND_API __declspec(dllexport)
#else
# define ZEND_API __declspec(dllimport)
#endif
#define ZEND_DLEXPORT __declspec(dllexport)
#define ZEND_DLIMPORT __declspec(dllimport)

executor_globals_idも次のように宣言する必要があります.
ZEND_DLIMPORT int executor_globals_id;
△これは役に立ちます.もし私がsqlite 3という拡張をコンパイルしているときなど、いくつかの拡張を手動でコンパイルする場合、この問題に遭遇します.