ホームページ >php教程 >php手册 >【古い記事からの転載】PHP拡張関数を自分で書く

【古い記事からの転載】PHP拡張関数を自分で書く

WBOY
WBOYオリジナル
2016-06-21 09:15:521178ブラウズ

比較|機能

著者:四方に浮かんでいます
まだテストしていませんが、興味があればテストしてみてください

ヨルゴ日 2002/01/22



私は長い間 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 拡張関数を完成させます。 in 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拡張子 my_module の config.m4

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



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

dnl このファイルは必要に応じて削除してください

。編集せずに dnl を実行します。



dnl 拡張機能が外部のものを参照している場合は、 with:



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 サポートを有効にするかどうか,

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 Include my_module support])

に変更します

PHP_ARG_WITH(my_module, for my_module support,

Makeコメントが整列していることを確認します:

[ --with-my_module Include my_module support])

または

dnl PHP_ARG_ENABLE(my_module, my_module supportを有効にするかどうか,

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

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

に変更されました

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

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

[ --enable-my_module my_module support を有効にする])



通常は後者を選択し、保存して終了します。 vi テキスト エディタの操作が難しい場合は、ここでは詳しく説明しませんが、対応する説明記事を参照してください。

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_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 –q Say_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 || エンドゲットパラメータex ( 1, &yourname) == FAILURE)

{

WRONG_PARAM_COUNT;

}



zend_printf("hello world, %sn", Z_STRVAL_PP(yourname));

}

保存して終了します。

phpのルートディレクトリに戻り、

make

を実行してsay_hello.phpを


Say_hello("yorgo");

?>

保存して終了して実行します

./php – q Say_hello.php

結果

hello 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()

渡されたパラメータの数を取得し、それがnot 1 場合によっては、問題が発生し、エラーが報告されることを意味します。

zend_get_parameters_ex(1, &yourname)

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

Z_STRVAL_PP(yourname)

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

(続く)








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