ホームページ  >  記事  >  バックエンド開発  >  独自の PHP 拡張機能を作成する function_PHP チュートリアル

独自の PHP 拡張機能を作成する function_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 16:10:01783ブラウズ


独自の PHP 拡張関数を作成する 私は長い間 PHP プログラムを書いているので、PHP が提供する機能はよく知っています。PHP が提供する機能はとても便利ですが、時々 PHP に足りない機能に気づき、PHP に追加したいと思うことがあります。 . カスタム機能のアイデア。時間が経つにつれて、今日はついに我慢できなくなり、追加する方法を研究し始めました。



ここで使用するバージョンは php 4.0.5 です。解凍すると、php のルート ディレクトリに README.EXT_SKEL のようなファイルが表示されます。このツールは、空の php 拡張機能を構築するのに役立ち、それに対応するコードを追加して独自の関数拡張機能を完成させることができます。以下にこのツールの使い方を紹介します。



まず、基本的な拡張フレームワークのみが必要な場合は、ディレクトリを php ディレクトリの下の ext ディレクトリに移動します。次のコマンドを実行します:

./ext_skel --extname=module_name

module_name は独自の名前です。選択できる拡張モジュール。たとえば、my_module を選択しました。ツールを実行すると、選択した module_name のディレクトリが ext ディレクトリに自動的に作成されます。これらのコードでは、config.m4 ファイル内の 3 行のコメントを調整するだけで済みます。このカスタマイズを使用して正常にコンパイルするには、PHP 用の拡張モジュールを使用します。 phpのルートディレクトリで以下の操作を行うことで取得できます。

./buildconf

./configure --enable-module_name

make



次に、より効果的にするために、my_module 拡張フレームワークを確立するプロセス全体を示します。PHP 拡張関数を完成させましょう。 php でこの関数を呼び出すと、Web ページに古典的な単語 hello world を表示できます。

php ディレクトリの下の ext ディレクトリで、次のコマンドを実行します

./ext_skel --extname=my_module

フィードバック結果を取得します:

ディレクトリ my_module の作成

基本ファイルの作成: config.m4 Makefile.in 。 cvsignore my_module.c php_my_module.h testing/001.phpt my_module.php [done].



新しい拡張機能を使用するには、次の手順を実行する必要があります:

1. $ cd..

2. $ vi ext/my_module/config.m4

3. $ ./buildconf

4. $ ./configure --[with|enable]-my_module

5. ext /my_module/my_module.php

7. $ vi ext/my_module/my_module.c

8. $ make



ext/my_module/config.m4 と

に満足するまで手順 3 ~ 6 を繰り返します。ステップ 6 では、モジュールが PHP にコンパイルされていることを確認します

コードの作成を開始し、最後の 2 つのステップを必要に応じて繰り返します。



上記を理解できる場合は、それに従ってください。よく理解できない場合は、以下のヒントに従ってください。

Cd my_module

首先入my_module目录

vi config.m4

使用文本编辑器打开config.m4文件,文件内容大致如下:

dnl $Id$

dnl config.m4 for extensionモジュール

dnl PHP_EXTENSION(my_module) を呼び出すことを忘れないでください



dnl このファイルのコメントは文字列 'dnl' で始まります。

dnl 必要に応じて削除してください。このファイルは編集しないと機能しません

dnl。拡張機能が外部のものを参照する場合は、次のように使用します:



dnl PHP_ARG_WITH(my_module, for my_module support,

dnl コメントが整列していることを確認してください:

dnl [ --with-my_module my_module サポートを含める])



dnl それ以外の場合は、enable:



dnl PHP_ARG_ENABLE(my_module, my_module サポートを有効にするかどうか,

d nl コメントが揃っていることを確認してください:

dnl [ --enable-my_module my_module サポートを有効にする])



if test "$PHP_MY_MODULE" != "no"; then

dnl

dnl ヘッダー、ライブラリ、関数の存在など、外部のものをテストしない場合は、次の行の

dnl のコメントを解除するだけで準備完了です。

dnl テストの例をもっと書くここ...

PHP_EXTENSION(my_module, $ext_shared)

Fi



準拠你自己的选择将

dnl PHP_ARG_WITH(my_module, for my_module support,

dnl コメントが揃っていることを確認してください編集:

dnl [ --with-my_module my_module support を含める])

修正改成

PHP_ARG_WITH(my_module, for my_module support,

コメントが揃っていることを確認してください:

[ --with-my_module my_module サポートを含める])

または将

dnl PHP_ARG_ENABLE(my_module, my_moduleのサポートを有効にするかどうか,

dnl コメントが整列していることを確認してください:

dnl [ --enable-my_module my_moduleのサポートを有効にする])

修正改成

PHP_ARG_ENABLE(my_module 、my_module サポートを有効にするかどうか、

コメントが整列していることを確認してください:

[ --enable-my_module Enable my_module support])



一般我会选择后者,その後保存退出。

Vi my_module.c

その中のファイルの下のコードを変更します

/* ユーザーに表示されるすべての関数には、 my_module_functions[] のエントリ.

*/

function_entry my_module_functions[] = {

PHP_FE(say_hello, NULL) /* ß追加着一行頁 */

PHP_FE(confirm_my_module_com piled, NULL) /* テストのため、後で削除します。 */

{NULL, NULL, NULL} /* my_module_functions[] の最後の行である必要があります */

};



在文件の最後追加下列代詞

PHP_FUNCTION(say_hello)

{

zend_printf("hello worldn");

}

保存文件退出



vi php_my_module.h

文件中PHP_FUNCTION(confirm_my_module_compiled); 一行前追加下面の代償

PHP_FUNCTION(say_hello) );

保存文書退出



phpの根目录下に戻り、次の面のコマンドを実行

./buildconf

./configure --enable-my_module

make



如果一切顺利的话、我们现在已经将扩展モジュールmy_moduleはphpのサイトにアクセスしました。私は次の番号を書きます


Say_hello();

?>

保存ファイルはsay_hello.php

phpのルート目录下运行

./php –qsay_hello.php

正常情况下会显示

hello world

表示我们的第一个扩展正常的行了! ,我们修正が必要な以下の文件

my_module.c 展モ块の主手順書

php_my_module.h 展モ块の主手順書

config.m4 構成文件



主手順書に記載されているインキュベーション、モジュール中どのような関数が含まれているか、各関数の機能が phpinfo 関数に表示され、モジュールがこれらの内容を初期化し、これらの内容がこのファイルで記述されています。上記では関数 Say_hello を追加し、say_hello 関数の具体的な内容を説明し、PHP で文字列を出力するために zend_printf システム関数を呼び出しました。



say_hello 関数は対応するヘッダー ファイルで宣言されており、それによって期待される関数が完成します。次に、より複雑な拡張機能を作成し、パラメーターを使用して PHP 拡張関数を作成し、指定されたパラメーターに基づいて hello world, xxxx を表示します。 Xxxx は、入力文字列の内容 (my name yorgo など) を表します。



Vi my_module.c

最終のsay_hello関数の内容を次のように変更します:

PHP_FUNCTION(say_hello)

{

if (ZEND_NUM_ARGS() != 1
zend_get_para meter_ex(1 , &yourname) == 失敗) STRVAL_PP (あなたの名前));

}

保存して終了します。根 PHP のルート ディレクトリに戻り、

make
を実行します。 world, yorgo

は、今回の変更が成功したことを示しています。say_hello のパラメーターを変更して、動的な効果を確認できます。

ここでは上記で修正した関数の内容を中心に説明します。say_hello関数はパラメータの導入が必要なため、my_module.cのsay_hello関数が主にパラメータを処理し、phpのsay_helloを参照する際に記入されたパラメータの内容を正しくInに渡します。 my_module.c の Say_hello 処理関数。この目的のために、これらの数行がプログラムに追加されました。

zval **あなたの名前;

if (ZEND_NUM_ARGS() != 1
zend_get_parameters_ex(1, &あなたの名前) == FAILURE)

{

WRONG_PARAM_COUNT;

}

zend_printf( "こんにちは、%sn", Z_STRVAL_PP(yourname));



コードは次のように説明されます:

zval **yourname;

パラメータポインタを初期化します

ZEND_NUM_ARGS()

渡されたパラメータの数を取得し、そうでないかを判断します1 問題があることを示し、エラーを報告します。

zend_get_parameters_ex(1, &yourname)

初期化したばかりのポインタを渡されたパラメータにポイントし、失敗した場合はエラーを報告します。

Z_STRVAL_PP(yourname)

は、ポインターが指すパラメーターを処理し、実際に格納されている値を取得します。

(続く)




http://www.bkjia.com/PHPjc/314349.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/314349.html

技術記事

独自の PHP 拡張関数を作成する 私は長い間 PHP プログラムを書いてきたので、当然のことながら、PHP が提供する機能はすべて知っており、PHP が提供する多くの機能が非常に便利だと本当に思っていますが、時々、...

と気づくことがあります。



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