PHP 拡張機能作成のヒント集_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:40:40
オリジナル
767 人が閲覧しました

赤い部分は私の注釈です。
詳細については、以下を参照してください:

1. よく使用される一般的な関数は zen_API.h などのヘッダー ファイルにカプセル化されているため、内部の詳細を調べて時間を無駄にする必要はありません。 (参照: PHP の拡張と埋め込みの付録 A)
2. ターミナルでテスト プログラムを実行すると、拡張機能の内部エラー出力が表示されます。これはメモリ リークの問題を解決するために特に重要です。 (デバッグ ライブラリをコンパイルします)
3. 開発プロセス中に Makefile の「CFLAGS = -g -O2」を変更し、最適化オプションを削除し、デバッグを容易にしてコンパイル警告を表示するために -Wall と -pedantic を追加します。特定の zval* がありますが、その strval はコピーされません。 zval_ptr_dtor(zval**) は使用できません。 efree(void*) を使用する必要があります。ターミナルの
5.$_SERVER['PWD'] には値がありますが、zend_getenv() では取得できません。その理由は、値が無意味であるか信頼できないためです。
6. 「エクスポートされた関数」を呼び出す場合、INTERNAL_FUNCTION_PARAM_PASSTHRU を使用してパラメーターを渡すことができます。宣言された非エクスポート関数は、INTERNAL_FUNCTION_PARAM を通じて「エクスポートされた関数」のパラメーターを使用できます。
7. 注: RETURN_TYPE を使用して除算の合計ループなどを選択する場合は、中かっこで囲むか、セミコロンを付けずに配置するのが最善です。次の理由からです。戻る; }。
8. 関数のパラメータが参照で非スカラーの場合、メモリ リークを防ぐために最初にそれらを破棄する必要があります。
9. 例外をスローする前に、EG に既に例外 (例外) があるかどうかを確認するのが最善です。そうしないと、メモリ リークが発生します。
10. WebサーバーAPIがISAPI(IIS)の場合、zend_getenv関数は動作しません。
11. zend_stack_push() にデータポインタを渡します。実際に格納される (コピーされる) のは、ポインタが指すデータです。つまり、渡されるのは格納されるデータのポインタでなければなりません。
ZEND_API int zend_stack_push(zend_stack *stack, void *element, int size);
ZEND_API int zend_stack_top(zend_stack *stack, void **element);
同様に、zend_hash もそうです。 、zend_hash_update と zend_hash_find を比較します。
12. zval の代わりに add_assoc_zval(HashTable*, const char*, zval*) を使用して zval* を保存します。 したがって、ユーザーによって渡されたパラメーターを保存する場合は、まず新しい zval をコピーする必要があります。そうしないと、エラーが発生します。 . 期待できること。
13.zval_dtor(zval*) は変数とその内部参照メモリを解放します。 zval_ptr_dtor(zval**) はまず refcount をチェックし、次に zval_dtor(zval*) を呼び出すかどうかを決定します。zval_copy_dtor(zval*) はディープ コピーのみを実行します。つまり、

14 をコピーせずに内部参照メモリのみをコピーします。 VC を使用して win ダイナミック リンク ライブラリをコンパイルし、zend_getenv などの zend 関数がコード内で呼び出される場合、これは次のように定義されます。 zend.h as:



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
(これは、特定の拡張機能を手動でコンパイルする場合などに便利です。 sqlite3 拡張機能をコンパイルしたときに、この問題が発生しました。)



http://www.bkjia.com/PHPjc/321343.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/321343.html

赤い部分は私の注釈です。 詳細については、次を参照してください。 1. よく使用される一般的な関数は、zen_API.h などのヘッダー ファイルにカプセル化されているため、内部の詳細を調べて時間を無駄にする必要はありません。 (参考…)
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート