首頁 >後端開發 >PHP問題 >PHP如何自訂擴充(一)之基本步驟

PHP如何自訂擴充(一)之基本步驟

藏色散人
藏色散人轉載
2021-12-20 15:47:282743瀏覽

php自訂擴充(一)

記得第一次寫php擴充是直接百度的,照著網路上寫完了一個擴展,但自己不知所以然,先看看一個擴展得基本步驟吧,然後再探討其中得原理。

利用原始碼工具自動產生擴充目錄結構

先進入php原始碼ext目錄下執行下面指令

/www/test/php/php/bin/php ext_skel.php --ext helloworld
cd helloworld

修改config.m4 設定文件,就是現在寫的擴充功能是否用到外部依賴,就配置--with-hello選項,否則配置--enable-hello選項,依照自己的需求把註解去掉

dnl If your extension references something external, use 'with':
 PHP_ARG_WITH([helloworld],
   [for helloworld support],
   [AS_HELP_STRING([--with-helloworld],
     [Include helloworld support])])

dnl Otherwise use 'enable':

擴充功能書寫

然後vim  helloworld.c 進行擴充功能程式碼書寫
先看下模組結構定義

zend_module_entry helloworld_module_entry = {
        STANDARD_MODULE_HEADER,
        "helloworld",                                   /* Extension name */
        helloworld_functions,                   /* zend_function_entry */
        PHP_MINIT(helloworld),                                                  /* PHP_MINIT - Module initialization */
        NULL,                                                   /* PHP_MSHUTDOWN - Module shutdown */
        PHP_RINIT(helloworld),                  /* PHP_RINIT - Request initialization */
        NULL,                                                   /* PHP_RSHUTDOWN - Request shutdown */
        PHP_MINFO(helloworld),                  /* PHP_MINFO - Module info */
        PHP_HELLOWORLD_VERSION,         /* Version */
        PHP_MODULE_GLOBALS(pib),
    NULL,
    NULL,
    NULL,
    STANDARD_MODULE_PROPERTIES_EX
};

功能函數名字集合

static const zend_function_entry helloworld_functions[] = {
        PHP_FE(helloworld_test1,                arginfo_helloworld_test1)
        PHP_FE(helloworld_test2,                arginfo_helloworld_test2)
        PHP_FE_END
};

真正的功能函數代碼

PHP_FUNCTION(helloworld_test2)
{
        int argc = ZEND_NUM_ARGS();
        char *messages = NULL;
        size_t   messages_len = 0;
        char *context = NULL;
        size_t   context_len = 0;

        zend_string *retval;

        ZEND_PARSE_PARAMETERS_START(0, 2)
                Z_PARAM_OPTIONAL
                Z_PARAM_STRING(messages, messages_len)
                Z_PARAM_STRING(context, context_len)
        ZEND_PARSE_PARAMETERS_END();

        retval = strpprintf(0, "Hello %s test %s", messages, context);

        RETURN_STR(retval);
}

函數參數定義

ZEND_BEGIN_ARG_INFO(arginfo_helloworld_test2, 0)
        ZEND_ARG_INFO(0, str)
ZEND_END_ARG_INFO()

編譯安裝##

/www/test/php/php/bin/phpize
./configure --with-php-config=/www/test/php/php/bin/php-config
make && make install
現在PHP的擴充目錄中已經有了

helloworld.so這個文件,在php.ini中加入上擴充的配置

extension = helloworld.so
然後就可以測試自己寫的函數了

helloworld_test2();完成了一個擴展後,感覺自己也沒什麼收穫,對為什麼要這麼寫一點都不知道其中得原理,下編就來談論其中得原理吧,先從php生命週期開始介紹,見下篇

推薦學習:《

PHP影片教學

以上是PHP如何自訂擴充(一)之基本步驟的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除