独自の 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 でこの関数を呼び出すと、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. $ make
6. - f 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$
拡張機能 my_module の dnl config.m4
dnl PHP_EXTENSION(my_module)
dnl このファイルのコメントは文字列 'dnl' で始まります。
dnl 必要に応じて削除します。このファイルは編集しないと機能しません
dnl。
dnl 拡張機能が外部のものを参照する場合は、
とともに使用します。 dnl PHP_ARG_WITH(my_module, for my_module support,
dnl コメントが整列していることを確認してください:
dnl [ --with-my_module Include my_module support])
dnl それ以外の場合は、enable を使用します:
dnl PHP_ARG_ENABLE(my_module, my_module サポートを有効にするかどうか,
dnl コメントが整列していることを確認してください:
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_compiled, 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
表示我们的第一个扩展正常的
解释一下面做的操作,ext_skel 生成一部下文件,我们要修正下文
my_module.c 扩展模块的主程序
php_my_module.h 扩展モ块の头文件
config.m4 構成文件
主程序中記述了php扩展モ块の警告、モ块に含まれる量関数、各関数の機能、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)
{
zval **yourname;
if (ZEND_NUM_ARGS() != 1
zend_get_parameters_ex(1, &yourname) == FAILURE)
{
WRONG_PARAM_COUNT;
}
zend_printf("hello world, %sn", Z_STRVAL_PP(あなたの名前));
}
保存して終了します。
php のルート ディレクトリに戻り、
make
を実行し、say_hello.php を
Say_hello( “yorgo ”);
?>
保存して終了し、
を実行します。/php –qsay_hello.php
結果を取得します
hello world, yorgo
は、今回の変更が成功したことを意味します。say_hello のパラメーターを変更して、動的な効果を確認できます。
ここでは主に上記で修正した関数の内容を説明します。say_hello関数はパラメータの導入が必要なため、my_module.cのsay_hello関数で主にパラメータの処理を行い、phpでsay_helloを参照する際にパラメータの内容を埋め込みます。 my_module.c のsay_hello 処理関数に正しく渡されました。この目的のために、これらの数行がプログラムに追加されました。
zval **yourname;
if (ZEND_NUM_ARGS() != 1
zend_get_parameters_ex(1, &yourname) == FAILURE)
{
WRONG_PARAM_COUNT;
}
zend_printf("hello world, %sn", Z_STRVAL_PP(yourname));
コードは次のように説明されます:
zval **yourname;
パラメータ ポインタを初期化します
ZEND_NUM_ARGS()
渡されたパラメータの数を取得し、そうでないかどうかを判断します1 問題があることを示し、エラーを報告します。
zend_get_parameters_ex(1, &yourname)
初期化したばかりのポインタを渡されたパラメータにポイントし、失敗した場合はエラーを報告します。
Z_STRVAL_PP(yourname)
ポインタが指すパラメータを処理し、実際に格納されている値を取得します。
(続く)