ホームページ >バックエンド開発 >PHPの問題 >PHPで拡張機能をカスタマイズする方法(1) 基本的な手順

PHPで拡張機能をカスタマイズする方法(1) 基本的な手順

藏色散人
藏色散人転載
2021-12-20 15:47:282707ブラウズ

php カスタム拡張機能 (1)

初めて php 拡張機能を作成したときは、Baidu から直接作成したことを覚えています。インターネットに基づいて拡張機能を作成しましたが、理由はわかりませんでした。まず拡張機能の基本的な手順を見てから、その背後にある原則を見てみましょう。

ソース コード ツールを使用して拡張ディレクトリ構造を自動的に生成します

まず、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()

コンパイルそして install

/www/test/php/php/bin/phpize
./configure --with-php-config=/www/test/php/php/bin/php-config
make && make install

ファイル helloworld.so が PHP 拡張ディレクトリにすでに存在するので、拡張設定 <pre class="brush:php;toolbar:false">extension = helloworld.so</pre>

php に追加します。 function

helloworld_test2();拡張機能を完成させた後、何も得ることができなかったように感じます。なぜそれを書いたのか原理がわかりません。次のパートで原理について話しましょう。まず、PHP ライフサイクルの始まりについて説明します。次のパート を参照してください。

推奨学習: 「

PHP ビデオ チュートリアル

以上がPHPで拡張機能をカスタマイズする方法(1) 基本的な手順の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。