ホームページ  >  記事  >  php教程  >  PHP拡張機能でHelloWorldを作ってみよう!

PHP拡張機能でHelloWorldを作ってみよう!

WBOY
WBOYオリジナル
2016-07-11 20:00:461383ブラウズ

PHP は多数の便利な関数を提供しますが、たとえば、多数の PECL (PHP Extension Community Library) が拡張機能 (ダイナミック リンク ライブラリ dll ファイル) の形式で提供されるなど、特殊な場合には拡張機能のプログラミングが必要になる場合があります。 PEAR ははるかに効率的に動作します。
PHP 拡張機能は C または C++ で記述されており、使用する前にダイナミック リンク ライブラリ DLL ファイルにコンパイルし、PHP 環境に登録する必要があります。
PHP 拡張機能を作成するためのソフトウェア要件:
VC++6.0またはVC++.NET環境。
PHPのソースコードをコンパイルする必要があります。
PHP のソース コードをコンパイルしたくない場合は、正常にコンパイルされた PHP のバイナリ コード (つまり、PHP ランタイム環境の展開に使用するファイル パッケージ) をダウンロードできます。個別にダウンロードしたソース ファイル パッケージとコンパイル済みパッケージのバージョンは一致している必要があることに注意してください。

プロセス:

1. VC++6.0 をインストールし、その実行可能ファイルのパスを環境変数に追加することを選択して、コマンド ライン環境の任意のパスでコンパイラーを実行できるようにします。
2. PHP 実行環境をインストールし、IIS と正しく統合します。使用されている PHP バージョンが 5.2.5 であると仮定して、php-5.2.5-Win32.zip バイナリ パッケージと php-5.2.5.tar.gz ソース コード パッケージをダウンロードします。インストール環境はC:php-5.2.5-Win32です。ソース コード パッケージとバイナリ パッケージをそれぞれこのフォルダーに抽出します。 php.ini の推奨コピーから php.ini ファイルを生成します。
3. C:php-5.2.5-Win32Release_TS フォルダーを作成し、C:php-5.2.5-Win32devphp5ts.lib ファイルをここにコピーします。
4. C:php-5.2.5-Win32ext フォルダーに入り、次のコマンドを実行します:
C:php-5.2.5-Win32ext>..php.exe ext_skel_win32.php --extname=myphpext
ディレクトリ myphpext の作成
基本ファイルの作成: config.m4 config.w32 .cvsignore myphpext.c php_myphpext.h
クレジット 実験的 testing/001.phpt myphpext.php [完了].

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

1. $cd ..
2. $ vi ext/myphpext/config.m4
3. $ ./buildconf
4. $ ./configure --[with|enable]-myphpext
5.$メイク
6. $ ./php -f ext/myphpext/myphpext.php
7. $ vi ext/myphpext/myphpext.c
8. $メイク

ext/myphpext/config.m4 と
に満足するまで手順 3 ~ 6 を繰り返します。 ステップ 6 では、モジュールが PHP にコンパイルされたことを確認してから、書き込みを開始します
。 コードを作成し、最後の 2 つの手順を必要に応じて繰り返します。

結果として、ext の下にフォルダー myphpext が生成されます。このフォルダーには、PHP 拡張アプリケーション プログラミング フレームワークが含まれています。 myphpext には任意の名前を付けることができます。今後生成される dll ファイルの形式は php_[extname].dll です。実行結果のプロンプト情報 1.2...8 は主に Linux/Unix 環境向けの情報ですので、特に注意する必要はありません。実際、Windows では config.m4 ファイルも変更する必要があるかもしれませんが、この単純なフレームワークではまだ必要ありません。

フォルダー myphpext には、以下を含むいくつかのファイルが含まれています:

Myphpext.dsp はプロジェクト ファイルであり、後で使用します。 Myphpext.php 拡張機能テスト ファイル;
php_myphpext.h 拡張関数定義ヘッダファイル
Myphpext.c 拡張機能固有の実装

上記 2 つの重要なファイルの内容:

php_myphpext.h ファイル:

/*
+------------------------------------------------ ------------------------+
| PHP バージョン 5 |
+------------------------------------------------ ------------------------+
| 著作権 (c) 1997-2007 PHP グループ |
+------------------------------------------------ ------------------------+
| このソース ファイルには、PHP ライセンスのバージョン 3.01 が適用されます。|
| これは、ファイル LICENSE 内のこのパッケージにバンドルされており、|
| ワールドワイドウェブから次の URL で入手できます: |
http://www.php.net/license/3_01.txt |
| PHP ライセンスのコピーを受け取っておらず、PHP ライセンスを取得できない場合|
| ワールドワイドウェブを通じて入手するには、メモを |
までお送りください。 | License@php.net にご連絡いただければ、すぐにコピーをメールでお送りいたします。               |
+------------------------------------------------ ------------------------+
| 著者: |
+------------------------------------------------ ------------------------+
*/


/* $Id: header,v 1.16.2.1.2.1 2007/01/01 19:32:09 iliaa Exp $ */

#ifndef PHP_MYPHPEXT_H
#define PHP_MYPHPEXT_H

extern zend_module_entry myphpext_module_entry;
#define phpext_myphpext_ptr &myphpext_module_entry

#ifdef PHP_WIN32
#define PHP_MYPHPEXT_API __declspec(dllexport)
#else
#define PHP_MYPHPEXT_API
#endif

#ifdef ZTS
#include
"TSRM.h"
#endif

PHP_MINIT_FUNCTION(myphpext);
PHP_MSHUTDOWN_FUNCTION(myphpext);
PHP_RINIT_FUNCTION(myphpext);
PHP_RSHUTDOWN_FUNCTION(myphpext);
PHP_MINFO_FUNCTION(myphpext);

PHP_FUNCTION(confirm_myphpext_compiled); 
/* テストのため、後で削除してください。 */
PHP_FUNCTION(HelloPHP);

/*
BEGIN の間に必要なグローバル変数を宣言します
およびENDマクロはこちら:

ZEND_BEGIN_MODULE_GLOBALS(myphpext)
long global_value;
char *global_string;
ZEND_END_MODULE_GLOBALS(myphpext)
*/


/* すべてのユーティリティ関数で、変数を使用する必要がある関数を追加します
php_myphpext_globals で、TSRMLS_FETCH() を呼び出します。 その他を宣言した後
その関数で使用される変数、またはさらに良いのは、TSRMLS_CC に渡すことです
最後の関数引数の後にユーティリティ関数を宣言します
最後に宣言された引数の後に TSRMLS_DC を付けます。  常に参照してください
関数内のグローバルを MYPHPEXT_G (変数) として指定します。  あなたは
これらのマクロの名前をもっと短いものに変更することをお勧めします。
を参照してください。 他の php モジュール ディレクトリ内の例。
*/


#ifdef ZTS
#define MYPHPEXT_G(v) TSRMG(myphpext_globals_id, zend_myphpext_globals *, v)
#else
#define MYPHPEXT_G(v) (myphpext_globals.v)
#endif

#endif /* PHP_MYPHPEXT_H */

/*
* ローカル変数:
* タブ幅: 4
* c-basic-offset: 4
* 終わり:
* vim600: noet sw=4 ts=4 fdm=marker
* vim
*/


myphpext.c ファイル:

/*
+------------------------------------------------ ------------------------+
| PHP バージョン 5 |
+------------------------------------------------ ------------------------+
| 著作権 (c) 1997-2007 PHP グループ |
+------------------------------------------------ ------------------------+
| このソース ファイルには、PHP ライセンスのバージョン 3.01 が適用されます。|
| これは、ファイル LICENSE 内のこのパッケージにバンドルされており、|
| ワールドワイドウェブから次の URL で入手できます: |
http://www.php.net/license/3_01.txt |
| PHP ライセンスのコピーを受け取っておらず、PHP ライセンスを取得できない場合|
| ワールドワイドウェブを通じて入手するには、メモを |
までお送りください。 | License@php.net にご連絡いただければ、すぐにコピーをメールでお送りいたします。               |
+------------------------------------------------ ------------------------+
| 著者: |
+------------------------------------------------ ------------------------+
*/


/* $Id: header,v 1.16.2.1.2.1 2007/01/01 19:32:09 iliaa Exp $ */

#ifdef HAVE_CONFIG_H
#include
"config.h"
#endif

#include
"php.h"
#include
"php_ini.h"
#include
"ext/standard/info.h"
#include
"php_myphpext.h"

/* php_myphpext.h でグローバルを宣言している場合は、次のコメントを解除してください:
ZEND_DECLARE_MODULE_GLOBALS(myphpext)
*/


/* 真のグローバル リソース - ここではスレッドの安全性は必要ありません*/
static int le_myphpext;

/* {{{ myphpext_functions[]
*
* ユーザーに表示されるすべての関数には、myphpext_functions[] にエントリが必要です。
*/

zend_function_entry myphpext_functions[]
= {
PHP_FE(confirm_myphpext_compiled, NULL)
/* テストのため、後で削除してください。 */
PHP_FE(HelloPHP, NULL)
{NULL, NULL, NULL} /* myphpext_functions[] の最後の行である必要があります*/
}
;
/* }}} */

/* {{{ myphpext_module_entry
*/

zend_module_entry myphpext_module_entry
= {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER、
#endif
myphpext
myphpext_functions、
PHP_MINIT(myphpext)、
PHP_MSHUTDOWN(myphpext)、
PHP_RINIT(myphpext)、
/*リクエスト開始時に何もすることがない場合は、NULL に置き換えます*/
PHP_RSHUTDOWN(myphpext)、
/* リクエスト終了時に何もすることがない場合は、NULL に置き換えます*/
PHP_MINFO(myphpext)、
#if ZEND_MODULE_API_NO >= 20010901
"0.1", /* 拡張機能のバージョン番号に置き換えてください*/
#endif
STANDARD_MODULE_PROPERTIES
}
;
/* }}} */

#ifdef COMPILE_DL_MYPHPEXT
ZEND_GET_MODULE(myphpext)
#endif

/* {{{ PHP_INI
*/

/* php.ini にエントリが必要な場合はコメントを削除し、記入してください
PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("myphpext.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_myphpext_globals, myphpext_globals)
STD_PHP_INI_ENTRY("myphpext.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_myphpext_globals, myphpext_globals)
PHP_INI_END()
*/

/* }}} */

/* {{{ php_myphpext_init_globals
*/

/* INI エントリがある場合は、この 関数のコメントを解除します
static void php_myphpext_init_globals(zend_myphpext_globals *myphpext_globals)
{
myphpext_globals->global_value = 0;
myphpext_globals->global_string = NULL;
}
*/

/* }}} */

/* {{{ PHP_MINIT_FUNCTION
*/

PHP_MINIT_FUNCTION(myphpext)
{
/* INI エントリがある場合は、これらの 行のコメントを解除します
REGISTER_INI_ENTRIES();
*/

戻る 成功;
}

/* }}} */

/* {{{ PHP_MSHUTDOWN_FUNCTION
*/

PHP_MSHUTDOWN_FUNCTION(myphpext)
{

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