PHP扩张模块结构

Jun 13, 2016 pm 01:16 PM
module php quot test zend

PHP扩展模块结构

所有PHP扩展遵循一个共同的结构

1、头文件包含(包括所有需要的宏、API)
2、C声明导出函数
3、声明Zend函数块

一、头文件包含

通过ext_seketon新建的扩展,默认都会新建一个php_extname.h的头文件。其中包含了
php.h,该文件导入Zend基本的宏和API。
二、声明导出函数

ZEND_FUNCTION(my_function),提供PHP中调用的函数。
展开此宏:
void zif_my_function(INTERNAL_FUNCTION_PARAMETERS)
void zif_my_function(int ht, zval *return_value, zval *this_ptr, int return_value_users, zend_executor_globals *executor_globals);
参数的作用:
参数 描述
ht 接收的参数个数。考虑向后兼容,使用ZEND_NUM_ARGS()来代替ht
return_value 传递到PHP接口的返回值。
this_ptr 如果这个函数是对象中的方法,this_ptr返回当前对象
return_value_used 标志最终这个函数返回到PHP接口中是否被使用。
executor_globals 指向zend引擎的全局设置。

三、声明Zend函数块

建立zend_function_entry数组,提供给ZEND作为PHP的接口。    

typedef struct _zend_function_entry {
    char *fname;
    void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
    unsigned char *func_arg_types;
} zend_function_entry;
Salin selepas log masuk
参数 描述
fname 提供给PHP中调用的函数名。例如mysql_connect
handler 负责处理这个接口函数的指针。
func_arg_types 标记参数。可以设置为NULL
static const zend_function_entry mysql_functions[] = {
                PHP_FE(mysql_connect,  arginfo_mysql_connect)
                PHP_FE(mysql_pconnect,  arginfo_mysql_pconnect)
                PHP_FE(mysql_close,  arginfo__optional_mysql_link)
                PHP_FE(mysql_select_db,  arginfo_mysql_select_db)
     {NULL, NULL, NULL}
}
Salin selepas log masuk

上述是mysql扩展中定义的zend_function_entry的部分。其中{NULL, NULL, NULL}标志数组的结束


四、声明Zend模块扩展结构

此块信息必须存储在zend_module_entry结构中,包含模块的必要信息。例如,初始化模块函数指针,模块的名称,版本信息等。

struct _zend_module_entry {
    unsigned short size;
    unsigned int zend_api;
    unsigned char zend_debug;
    unsigned char zts;
    char *name;
    zend_function_entry *functions;
    int (*module_startup_func)(INIT_FUNC_ARGS);
    int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS);
    int (*request_startup_func)(INIT_FUNC_ARGS);
    int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS);
    void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS);
    char *version;
    [more]
};
Salin selepas log masuk

typedef struct _zend_module_entry zend_module_entry;
Salin selepas log masuk

参数 描述
size, zend_api, zend_debug and zts 通常使用STANDARD_MODULE_HEADER来填充,
name 扩展的名称
functions 指向zend_functions_entry指针
module_startup_func 模块初始化时被调用的函数指针。用来放一些初始化步骤。初始化过程中出现故障返回FAILURE,成功返回SUCCESS。声明一个初始化函数使用ZEND_MINIT
module_shutdown_func 模块被关闭时调用的函数指针,同来用来做一次性的析构步骤。如释放资源。
成功返回SUCESS,失败返回FAILURE,未使用返回NULL。声明使用ZEND_MSHUTDOWN
request_startup_func 每处理一次请求前调用此函数。成功SUCESS,失败FAILURE,未使用返回NULL。声明使用ZEND_RINIT。
从WEB来解释,就是每次请求调用此函数。
request_startup_func 每处理一次请求前后调用此函数。成功SUCESS,失败FAILURE,未使用返回NULL。声明使用ZEND_RINIT。
request_shutdown_func 每处理一次请求结束后调用此函数。成功SUCESS,失败FAILURE,未使用返回NULL。声明使用ZEND_RSHUTDOWN。
info_func 当调用phpinfo()时打印出的关于此扩展的信息。
这个信息就是由此函数来输出的。
声明使用ZEND_MINFO
version 扩展的字符串版本号。若无版本号,可以使用NO_VERSION_YET
[more] 多余不重要的参数,可以使用宏STANDARD_MODULE_PROPERTIES_EX或STANDARD_MODULE_PROPERTIES
zend_module_entry firstmod_module_entry =
{
    STANDARD_MODULE_HEADER,
    "New Module",
    firstmod_functions,
    NULL, NULL, NULL, NULL, NULL,
    NO_VERSION_YET,
    STANDARD_MODULE_PROPERTIES,
};
Salin selepas log masuk

这是一个最基本的模块结构,模块名“New Module”,函数列表为firstmod_functions,未设置startup、shutdown函数


下面是名为test的PHP扩展的文件,通过上面的介绍,对比下面的代码,就会比较清晰的理解PHP扩展开发的步骤。


#ifdef HAVE_CONFIG_H
#include "config.h"
#endif


/*包含ZEND提供的API、宏和基本的PHP内置函数,例如php_trim*/
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_test.h"

/* 开启模块中的全局变量 */
ZEND_DECLARE_MODULE_GLOBALS(test)

/* True global resources - no need for thread safety here */
static int le_test;

/* 
* 声明函数数组,提供给PHP使用
*/
const zend_function_entry test_functions[] = {
     PHP_FE(my_function,     NULL)          /* For testing, remove later. */
     PHP_FE_END     /* Must be the last line in test_functions[] */
};
/* }}} */

/* 模块结构,声明了startup\shutdown、模块名及phpinfo打印时的函数
*/
zend_module_entry test_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
     STANDARD_MODULE_HEADER,
#endif
     "test",
     test_functions,
     PHP_MINIT(test),
     PHP_MSHUTDOWN(test),
     PHP_RINIT(test),          /* Replace with NULL if there's nothing to do at request start */
     PHP_RSHUTDOWN(test),     /* Replace with NULL if there's nothing to do at request end */
     PHP_MINFO(test),
#if ZEND_MODULE_API_NO >= 20010901
     "0.1", /* Replace with version number for your extension */
#endif
     STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_TEST
ZEND_GET_MODULE(test)
#endif

/* 从php.ini配置文件中读取配置信息 */
PHP_INI_BEGIN()
    STD_PHP_INI_ENTRY("test.global_value",      "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_test_globals, test_globals)
    STD_PHP_INI_ENTRY("test.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_test_globals, test_globals)
PHP_INI_END()


/* 初始化全局变量默认值 */
static void php_test_init_globals(zend_test_globals *test_globals)
{
     test_globals->global_value = 0;
     test_globals->global_string = NULL;
}


/* 模块第一次加载时被调用
*/
PHP_MINIT_FUNCTION(test)
{
     /* 注册全局变量 */
     REGISTER_INI_ENTRIES();
     
     return SUCCESS;
}

/* 模块关闭时调用
*/
PHP_MSHUTDOWN_FUNCTION(test)
{
     /* 释放全局变量 */
     UNREGISTER_INI_ENTRIES();
     
     return SUCCESS;
}

/* 每次请求前调用
*/
PHP_RINIT_FUNCTION(test)
{
     return SUCCESS;
}

/* 
/* 每次请求结束时调用
*/
PHP_RSHUTDOWN_FUNCTION(test)
{
     return SUCCESS;
}

/* phpinfo()输出扩展信息
*/
PHP_MINFO_FUNCTION(test)
{
     php_info_print_table_start();
     php_info_print_table_header(2, "test support", "enabled");
     php_info_print_table_end();

     /* 是否输出php.ini中的配置信息
     DISPLAY_INI_ENTRIES();
     */
}


/* 定义函数my_function提供给PHP中使用 */
PHP_FUNCTION(my_function)
{
     char *arg = NULL;
     int arg_len, len;
     char *strg;

     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
          return;
     }

     len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "test", arg);
     RETURN_STRINGL(strg, len, 0);
}
Salin selepas log masuk
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Jam pintar Huawei Watch GT 5 mendapat kemas kini dengan ciri baharu Jam pintar Huawei Watch GT 5 mendapat kemas kini dengan ciri baharu Oct 03, 2024 am 06:25 AM

Huawei sedang melancarkan perisian versi 5.0.0.100(C00M01) untuk Watch GT 5 dan Watch GT 5 Prosmartwatches di seluruh dunia. Kedua-dua jam tangan pintar ini baru-baru ini dilancarkan di Eropah, dengan model standard tiba sebagai model termurah syarikat. Harmoni ini

Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Feb 07, 2025 am 11:57 AM

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Program PHP untuk mengira vokal dalam rentetan Program PHP untuk mengira vokal dalam rentetan Feb 07, 2025 pm 12:12 PM

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Pemanas Minyak Xiaomi Mijia Graphene baharu dengan HyperOS tiba Pemanas Minyak Xiaomi Mijia Graphene baharu dengan HyperOS tiba Oct 02, 2024 pm 09:02 PM

Xiaomi akan melancarkan Pemanas Minyak Mijia Graphene sebentar lagi di China. Syarikat itu baru-baru ini menjalankan kempen crowdfunding yang berjaya untuk produk rumah pintar, dihoskan pada platform Youpinnya. Menurut halaman tersebut, peranti telah mula dihantar ke

7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini 7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini Nov 13, 2024 am 09:42 AM

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

10 Platform CMS PHP Terbaik Untuk Pembangun pada 2024 10 Platform CMS PHP Terbaik Untuk Pembangun pada 2024 Dec 05, 2024 am 10:29 AM

CMS bermaksud Sistem Pengurusan Kandungan. Ia adalah aplikasi perisian atau platform yang membolehkan pengguna mencipta, mengurus dan mengubah suai kandungan digital tanpa memerlukan pengetahuan teknikal lanjutan. CMS membolehkan pengguna membuat dan menyusun kandungan seperti teks, imej, video dan dokumen dengan mudah serta menerbitkannya di tapak web atau platform digital lain.

See all articles