Heim Backend-Entwicklung PHP-Tutorial php扩展如何嵌入到php框架中

php扩展如何嵌入到php框架中

Jun 23, 2016 pm 02:29 PM

编写一个简单的扩展示例

使用php内置工具生成自定义扩展的框架。该工具在ext文件夹下面

./ext_skel --extname=wully

 

Ext_skel的主要参数(这里面只列举了最常用的两个)

  --extname=module   module is the name of your extension【必须有的】

生成模块的名称,会自动在ext内建立extname文件夹,最常用的

  --proto=file       file contains prototypes of functions to create【可选】

函数原型定义文件

 

官方说明地址:

http://www.php.net/manual/en/internals2.buildsys.skeleton.php

 

修正ext/wully/config.m4

 

修正后,运行:

./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扩展函数的实现逻辑

每一个扩展函数都是通过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, …);

有两个参数我们要特别注意下:

第一个参数为该函数获取的参数个数

第三个参数为php函数传过来的参数类型,下表是一个对应关系图

后面的参数则是参数的值,及参数的大小,第二个参数对应于线程安全,这里面先不关心

 

参数类型对应表

类型指定符

对应的C类型

描述

l

long

符号整数

d

double

浮点数

s

char *, int

二进制字符串,长度

b

zend_bool

逻辑型(1或0)

r

zval *

资源(文件指针,数据库连接等)

a

zval *

联合数组

o

zval *

任何类型的对象

O

zval *

指定类型的对象。需要提供目标对象的类类型

z

zval *

无任何操作的zval

 

 

再看一个三个参数,一个为字符串,两个为整数

zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sll", &arg, &arg_len,&n,&m)

 

 PHP_FUNCTION展开模式:

#define PHP_FUNCTION        ZEND_FUNCTION

#define ZEND_FUNCTION(name)        ZEND_NAMED_FUNCTION(ZEND_FN(name))

#define ZEND_FN(name) zif_##name

#define ZEND_NAMED_FUNCTION(name)        void name(INTERNAL_FUNCTION_PARAMETERS)

#define 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, name, arg_info, (zend_uint) (sizeof(arg_info)/sizeof(struct _zend_arg_info)-1), flags },

 

 

按照php处理请求的各个阶段我们分为 mint rint   script rshutdown mshutdown,我们自定义的外部扩展对请求的各个阶段也可以进行相应的干预。


各个阶段的干预接口为:


MINIT阶段:模块初始化阶段

对应PHP_MINIT(wully)的实现

在sapi的start阶段,调用zend_startup_module

ZEND_API int zend_startup_module(zend_module_entry *module)执行两个动作注册模块,启动模块

注册模块

zend_register_internal_module(module TSRMLS_CC)

把module放入 module_registry 中,其中 module_registry 为一个全局的hash tab

 

启动模块

zend_startup_module_ex(module TSRMLS_CC) == SUCCESS

检测依赖是否就绪,然后运行该module的 PHP_MINIT函数

 

MINIT宏展开模式:

#define PHP_MINIT                ZEND_MODULE_STARTUP_N

#define ZEND_MINIT                        ZEND_MODULE_STARTUP_N

#define ZEND_MODULE_STARTUP_N(module)       zm_startup_##module

 

RINIT阶段:请求初始化

 

对应PHP_RINIT(wully)的实现

int php_request_startup(TSRMLS_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_ACTIVATE_N

#define ZEND_MODULE_ACTIVATE_N(module)  zm_activate_##module

 

script阶段

我们的PHP_FUNCTION执行在script阶段,他们作为php语言编译和解释的一部分,纳入到opcode的执行中

 

PHP_RSHUTDOWN阶段:请求关闭

对应PHP_RSHUTDOWN(wully))的实现

 

void php_request_shutdown(void *dummy)

void zend_deactivate_modules(TSRMLS_D)

int module_registry_cleanup(zend_module_entry *module TSRMLS_DC)

module->request_shutdown_func(module->type, module->module_number TSRMLS_CC)

 

PHP_RSHUTDOWN        宏展开模式

#define PHP_RSHUTDOWN            ZEND_MODULE_DEACTIVATE_N

#define ZEND_MODULE_DEACTIVATE_N(module)        zm_deactivate_##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, ZEND_MODULE_DTOR, 1, 0);

#define ZEND_MODULE_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

#define ZEND_MINFO                        ZEND_MODULE_INFO_N

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

11 beste PHP -URL -Shortener -Skripte (kostenlos und Premium) 11 beste PHP -URL -Shortener -Skripte (kostenlos und Premium) Mar 03, 2025 am 10:49 AM

Lange URLs, die oft mit Schlüsselwörtern und Tracking -Parametern überfüllt sind, können Besucher abschrecken. Ein URL -Verkürzungsskript bietet eine Lösung, die präzise Links erstellt, die ideal für soziale Medien und andere Plattformen sind. Diese Skripte sind für einzelne Websites a wertvoll

Einführung in die Instagram -API Einführung in die Instagram -API Mar 02, 2025 am 09:32 AM

Nach seiner hochkarätigen Akquisition durch Facebook im Jahr 2012 nahm Instagram zwei APIs für den Einsatz von Drittanbietern ein. Dies sind die Instagram -Graph -API und die Instagram Basic Display -API. Ein Entwickler, der eine App erstellt, die Informationen von a benötigt

Arbeiten mit Flash -Sitzungsdaten in Laravel Arbeiten mit Flash -Sitzungsdaten in Laravel Mar 12, 2025 pm 05:08 PM

Laravel vereinfacht die Behandlung von temporären Sitzungsdaten mithilfe seiner intuitiven Flash -Methoden. Dies ist perfekt zum Anzeigen von kurzen Nachrichten, Warnungen oder Benachrichtigungen in Ihrer Anwendung. Die Daten bestehen nur für die nachfolgende Anfrage standardmäßig: $ Anfrage-

Erstellen Sie eine React -App mit einem Laravel -Back -Ende: Teil 2, reagieren Erstellen Sie eine React -App mit einem Laravel -Back -Ende: Teil 2, reagieren Mar 04, 2025 am 09:33 AM

Dies ist der zweite und letzte Teil der Serie zum Aufbau einer Reaktionsanwendung mit einem Laravel-Back-End. Im ersten Teil der Serie haben wir eine erholsame API erstellt, die Laravel für eine grundlegende Produktlistenanwendung unter Verwendung von Laravel erstellt hat. In diesem Tutorial werden wir Dev sein

Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Vereinfachte HTTP -Reaktion verspottet in Laravel -Tests Mar 12, 2025 pm 05:09 PM

Laravel bietet eine kurze HTTP -Antwortsimulationssyntax und vereinfache HTTP -Interaktionstests. Dieser Ansatz reduziert die Code -Redundanz erheblich, während Ihre Testsimulation intuitiver wird. Die grundlegende Implementierung bietet eine Vielzahl von Verknüpfungen zum Antworttyp: Verwenden Sie Illuminate \ Support \ facades \ http; Http :: fake ([ 'Google.com' => 'Hallo Welt',, 'github.com' => ['foo' => 'bar'], 'Forge.laravel.com' =>

Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Curl in PHP: So verwenden Sie die PHP -Curl -Erweiterung in REST -APIs Mar 14, 2025 am 11:42 AM

Die PHP Client -URL -Erweiterung (CURL) ist ein leistungsstarkes Tool für Entwickler, das eine nahtlose Interaktion mit Remote -Servern und REST -APIs ermöglicht. Durch die Nutzung von Libcurl, einer angesehenen Bibliothek mit Multi-Protokoll-Dateien, erleichtert PHP Curl effiziente Execu

12 Beste PHP -Chat -Skripte auf Codecanyon 12 Beste PHP -Chat -Skripte auf Codecanyon Mar 13, 2025 pm 12:08 PM

Möchten Sie den dringlichsten Problemen Ihrer Kunden in Echtzeit und Sofortlösungen anbieten? Mit Live-Chat können Sie Echtzeitgespräche mit Kunden führen und ihre Probleme sofort lösen. Sie ermöglichen es Ihnen, Ihrem Brauch einen schnelleren Service zu bieten

Ankündigung von 2025 PHP Situation Survey Ankündigung von 2025 PHP Situation Survey Mar 03, 2025 pm 04:20 PM

Die 2025 PHP Landscape Survey untersucht die aktuellen PHP -Entwicklungstrends. Es untersucht Framework -Nutzung, Bereitstellungsmethoden und Herausforderungen, die darauf abzielen, Entwicklern und Unternehmen Einblicke zu geben. Die Umfrage erwartet das Wachstum der modernen PHP -Versio

See all articles