ホームページ >バックエンド開発 >PHPチュートリアル >PHP拡張機能をPHPフレームワークに埋め込む方法
簡単な拡張機能の例を作成します
PHP 組み込みツールを使用して、カスタム拡張機能のフレームワークを生成します。このツールは ext フォルダーの下にあります
./ext_skel --extname=wully
Ext_skel の主なパラメータ (ここには最もよく使用される 2 つのパラメータのみがリストされています)
--extname=module モジュールの名前です拡張機能 [必須]
モジュールの名前を生成すると、extname フォルダーが ext 内に自動的に作成されます。最も一般的に使用される
--proto=file ファイルには、[オプション]
関数プロトタイプを作成するための関数のプロトタイプが含まれています。定義ファイル
公式記述アドレス:
http://www.php.net/manual/en/internals2.buildsys.skeleton.php
ext/wully/config.m4を修正
After修正、実行:
./buildconf --force
./configure --enable-wully
Make & make install を実行すると、インストールが成功します
ext/wully/wully を実行すると、インストールが成功したかどうかを確認できます.php
拡張機能の内部実装
生成された wully モジュールを例として取り上げますが、このモジュールによって提供される外部関数は
const zend_function_entry wully_functions[] (wully.c) に表示されます。例を見ることができます。 定義された関数は
PHP_FE(confirm_wully_compiled, NULL)
です。このモジュールの外部関数と、php リクエストの各段階でのモジュールの呼び出しロジックは、
wully_module_entry ( zend_module_entry) 構造体
php 拡張関数 実装ロジック
各拡張関数は PHP_FUNCTION を通じて実装されます。たとえば、この例では PHP_FUNCTION(confirm_wully_compiled) を通じて実装されます
php のパラメータの取得方法内部的に関数
生成されるソースコード関数は次のとおりです:
zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len)
これはパラメータであり、パラメータの型は文字列です
呼び出しのプロトタイプは:
zend_parse_parameters(int num_args TSRMLS_DC, char * type_spec, …);
特別な注意を払うべきパラメータが 2 つあります:
最初のパラメータは、関数によって取得されるパラメータの数です
3 番目のパラメータは、php 関数によって渡されるパラメーターの型です。次の表は、パラメーターの値とパラメーターのサイズです。
2 番目のパラメーターは、スレッド セーフに対応します。パラメータ型対応表
| 対応するCの型
| 説明
|
| long
| 符号付き整数
|
| double
| 浮動小数点数
|
| char *, int B inary 文字列、長さ |
|
zend_bool | 論理型 (1 または 0) |
|
zval * | リソース (ファイル ポインター、データベース接続など) |
|
zval * | 連想配列 |
|
zval * | 任意の型のオブジェクト |
| O
zval * | 指定された型のオブジェクト。ターゲットオブジェクトのクラスタイプを指定する必要があります |
| z
zval * | zval を操作せずに |
さらに 3 つのパラメータを見てください。1 つは文字列、2 つは整数です zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sll", &arg, &arg_len,&n,&m)
PHP _FUNCTION 拡張モード ; MED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS) # INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC
外部関数リストの拡張モードを提供します、つまり PHP_FE #define PHP_FE 定義 ZEND_FE #define ZEND_FE(name, arg_info ) ZEND_FENTRY(name, ZEND_FN(name), arg_info, 0) #define ZEND_FENTRY(zend_name, name, arg_info, flags) { #zend_name, 名前, arg_info, (zend_uint) (sizeof(arg_info)/sizeof(struct _zend_arg_ info) -1), flags },
PHP 処理リクエストのさまざまな段階に従って、mint rint スクリプト rshutdown mshutdown に分けられます。カスタマイズされた外部拡張機能も、必要に応じてリクエストの各段階に介入できます。 各ステージの介入インターフェースは次のとおりです:
MINITステージ: モジュール初期化ステージ sapiの開始ステージで、zend_startup_moduleを呼び出します モジュールを登録します zend_register_internal_module (モジュール TSRMLS_CC) モジュールを module_registry に入れます (module_registry はグローバル ハッシュ タブです)
モジュールの開始 zend_startup _module_ex(module TSRMLS_CC) == Success 依存関係の準備ができているかどうかをテストし、モジュール pHP_minit 関数を実行します
: #define php_minit zend_startup_n#define Init ZEND_MODULE_STARTUP_N #Zend_module_Startup_n (モジュール) zm_startup_# #module
RINIT フェーズ: 初期化リクエスト
PHP_RINIT(wully) の対応する実装 int RMLS_D) void zend_activate_modules(TSRMLS_D) int module_registry_request_startup (zend_module_entry *module TSRMLS_DC) module->request_startup_func(module->type, module->module_number TSRMLS_CC)
RINIT マクロ拡張モード #define PHP_RINIT ZEND_MODULE_ACTIVATE _N #define ZEND_RINIT ZEND_MODULE_ACTIV ATE_N #define ZEND_MODULE_ACTIVATE_N(module) zm_activate_##module
スクリプトフェーズ PHP_FUNCTION は、PHP 言語のコンパイルと解釈の一部としてオペコードの実行に含まれます。フェーズ: クロージャのリクエスト PHP_RSHUTDOWN(wully) の実装に対応します)
void php_request_shutdown(void *dummy) void zend_deactivate_modules(TSRMLS_D) int module_registry_cleanup(zend_ module_entry *モジュール TSRMLS_DC) module-> request_sh utdown_func(モジュール->タイプ, モジュール->モジュール番号 TSRMLS_CC)
PHP_RSHUTDOWN use using ‐ ‐ ‐ ‐ ‐ ‐ ‐ #module
PHP_MSHUTDOWN ステージを使用してモジュールをシャットダウンします。 の実装に対応PHP_MSHUTDOWN(wully)) モジュールが破棄されたときにzend_startupデストラクターに登録します int zend_startup(zend_utility_functions *utility_functions, char **extensions TSRMLS_DC) zend_hash_init_ex(&module_registry, 50, NULL, _DTOR, 1, 0); # ZEND_MODU LE_DTOR (void (*)( void *)) module_destructor を定義します void module_destructor(zend_module_entry *module) module->module_shutdown_func(module->type, module->module_number TSRMLS_CC);
PHP_MSHUTDOWNマクロ拡張モード #define PHP_MSHUTDOWN ZEND_MODULE_SHUTDOWN_N #define ZEND_MODULE_SHUTDOWN_N(module) zm_shutdown_##module
PHP_MINFO は先ほどのマクロとは意味が異なり、主に phpinfo でモジュール情報を表示するために使用されます #define PHP_MINFO ZEND_MODULE_INFO_N # ZEND_MINFO の定義 |