独自の 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
true
http://www.bkjia.com/PHPjc/314349.html
技術記事
独自の PHP 拡張関数を作成する 私は長い間 PHP プログラムを書いてきたので、当然のことながら、PHP が提供する機能はすべて知っており、PHP が提供する多くの機能が非常に便利だと本当に思っていますが、時々、...
と気づくことがあります。