ホームページ >バックエンド開発 >PHPチュートリアル >PHP拡張機能をPHPフレームワークに埋め込む方法

PHP拡張機能をPHPフレームワークに埋め込む方法

WBOY
WBOYオリジナル
2016-06-23 14:29:34782ブラウズ

簡単な拡張機能の例を作成します

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の型説明llong符号付き整数ddouble浮動小数点数schar *, intbraoOz

B inary 文字列、長さ

zend_bool

論理型 (1 または 0)

zval *

リソース (ファイル ポインター、データベース接続など)

zval *

連想配列

zval *

任意の型のオブジェクト

zval *

指定された型のオブジェクト。ターゲットオブジェクトのクラスタイプを指定する必要があります

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ステージ: モジュール初期化ステージ

PHP_MINIT (wully)の実装に対応

sapiの開始ステージで、zend_startup_moduleを呼び出します


ZEND_API 整数zend _startup_module(zend_module_entry * module) は、モジュールを登録するための 2 つのアクションを実行し、モジュールを開始します

モジュールを登録します

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 の定義

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。