目次
phpinfo()コールバック関数を書く
ホームページ バックエンド開発 PHPチュートリアル PHP 拡張機能の開発に関する簡単な説明 - 基本ページ 1/2_PHP チュートリアル

PHP 拡張機能の開発に関する簡単な説明 - 基本ページ 1/2_PHP チュートリアル

Jul 21, 2016 pm 03:33 PM
exa php then write ベース 開発する まとめ

概要と紹介
PHP は現在広く使用されている言語で、海外の Facebook や Twitter から国内の Taobao、Tencent、Baidu まで、あらゆる大中小規模の Web サイトで見ることができます。インターネット。 PHP の成功は、そのオープンな拡張 API メカニズムと豊富な拡張コンポーネント (PHP 拡張) に大きく依存していると言えます。PHP がさまざまなデータベース操作から XML、JSON、暗号化、ファイル処理までを実行できるようにするのは、これらの拡張コンポーネントです。グラフィックス処理やSocketなどの分野で万能です。場合によっては、開発者が独自の PHP 拡張機能を開発する必要がある場合があります。PHP5 の現在の拡張機能メカニズムは、豊富なインターフェイスとマクロ定義に加えて、いくつかの実用的なツールを提供するため、PHP 拡張機能の開発はそれほど難しくありません。この記事では、PHP 拡張機能コンポーネントの開発に関する基本的な知識を紹介し、例を通じて PHP 拡張機能を開発する基本プロセスを示します。

PHP 拡張コンポーネントの開発プロセスは Unix 環境と Windows 環境では異なりますが、基本的には相互運用可能です。この記事は Unix 環境 (特に Linux を使用) に基づいて説明します。この記事を読むには、Unix 環境についての簡単な理解、PHP および C 言語の基本的な知識が必要です。簡単な理解がある限り、オペレーティング システムと言語の特殊な機能については触れず、必要に応じて説明します。読者の読みを容易にします。

この記事の具体的な開発環境は、Ubuntu 10.04 + PHP 5.3.3です。

PHP ソース コードをダウンロードする
PHP 拡張機能を開発するには、最初のステップとして PHP ソース コードをダウンロードします。これには、拡張機能の開発に必要なツールが含まれています。最新バージョンの PHP 5.3.3 を tar.bz2 圧縮パッケージの形式でダウンロードしました。ダウンロード アドレスは、http://cn.php.net/get/php-5.3.3.tar.bz2/from/a/mirror です。

ダウンロード後、ソースコードを適切なディレクトリに移動して解凍します。解凍コマンドは次のとおりです:

コードをコピーします コードは次のとおりです:
tar -jxvf ソースパッケージ名

tar.gz 圧縮パッケージをダウンロードした場合、解凍コマンドは次のとおりです
コードコードは次のとおりです:
tar -zxvf ソースパッケージ名

解凍後、ソースコードディレクトリ内にextディレクトリが存在します。これはPHP拡張機能に関連するディレクトリです。ディレクトリに入って ls で表示すると、多数の既存の拡張子が表示されます。下の写真は私の環境で閲覧した結果です


image

青いのは拡張パッケージのディレクトリで、おなじみのmysql、iconv、gdなどが入っています。 ext_skel は、Unix 環境で PHP 拡張フレームワークを自動生成するために使用されるスクリプト ツールです。 ext_skel_win32.php は、Windows での対応するスクリプトです。

独自の PHP 拡張機能を開発する - Say_hello
次に、PHP 拡張機能 Say_hello を開発します。この拡張機能は非常に単純で、文字列パラメータを受け入れて「Hello xxx!」を出力するだけです。この例は、PHP 拡張コンポーネントの開発プロセスを紹介するだけであり、実際の機能を想定したものではありません。

拡張コンポーネント フレームワークを生成する
PHP の拡張コンポーネント開発ディレクトリとファイルは固定された構造になっており、既存の拡張コンポーネント ディレクトリに入るだけで、そのすべてのファイルを確認できると思います。もちろん、フレームワークを手動で構築することもできますが、何かに代わって構築してもらいたいと思うでしょう。上記の ext_skel スクリプトは、拡張機能パッケージ フレームワークを自動的に構築するために使用されるツールです。 ext_skel の完全なコマンドは次のとおりです:

ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]] [--skel=dir] [--full- xml ] [--no-help]

初心者として、すべてのコマンド パラメーターを知る必要はありません。実際、ほとんどの場合、最初のパラメーター (拡張モジュールの名前) を指定するだけで済みます。 。したがって、ext ディレクトリに次のコマンドを入力します:
./ext_skel --extname=say_hello

(ext_skel のさまざまなコマンド パラメータについて詳しく知りたい場合は、ここを参照してください)

この時点で、ls を使用して再度確認すると、追加の「say_hello」ディレクトリがあることがわかります。このディレクトリに入ると、以下に示すように、ext_skel が Say_hello の基本フレームワークを確立していることがわかります。

image

PHP 拡張パッケージのディレクトリ構造の内容全体を理解するのが面倒な場合は、その中に注意する必要がある 3 つのファイルがあります:

config.m4: これは Unix 環境のビルド システム構成ファイルであり、後で構成とインストールを生成するために使用されます。

php_say_hello.h: このファイルは拡張モジュールのヘッダー ファイルです。 C 言語の一貫したスタイルに従って、いくつかのカスタム構造体、グローバル変数などをこの中に配置できます。

say_hello.c: これは拡張モジュールのメイン プログラム ファイルです。拡張モジュールの最後の関数エントリがここにあります。もちろん、すべてのプログラム コードをその中に詰め込むこともできますし、モジュールの考え方に従って各機能モジュールを異なるファイルに入れることもできます。

以下のコンテンツは主にこれら 3 つのファイルを中心に展開します。

Unix ビルドシステム構成

PHP 拡張コンポーネントを開発する最初のステップは、実装コードを記述することではなく、まず [Build System] オプションを構成することです。 Linux で開発しているため、ここでの設定は主に config.m4 に関連します。

Build System の設定については、Unix システムの多くのことに関連しているので、詳しく書くことができますが、私が興味を持って書いても、誰もが読むことに興味がないと思われるので、ここでは省略し、重要なポイントのみに焦点を当てます。config.m4 の詳細については、こちらを参照してください。

生成された config.m4 ファイルを開きます。内容はおおよそ次のとおりです:


コードをコピーします コードは次のとおりです:

dnl $Id$
dnl config.m4 (拡張子 Say_hello 用)
dnl このファイル内のコメントは文字列「dnl」で始まります。
dnl 必要に応じて削除します。このファイルは
dnl を編集しないと機能しません。
dnl 拡張機能が外部のものを参照している場合は、次とともに使用します:
dnl PHP_ARG_WITH(say_hello, Say_hello サポートの場合、
dnl コメントが整列していることを確認してください:
dnl [ --with-say_hello Include Say_hello support])
dnl それ以外の場合は、enable を使用します:
dnl PHP_ARG_ENABLE(say_hello、say_hello サポートを有効にするかどうか、
dnl コメントが整列していることを確認してください:
dnl [ --enable-say_hello Say_hello サポートを有効にする])
if test "$PHP_SAY_HELLO" != "no";それから
dnl ここにテストの例をさらに書いてください...
dnl # --with-say_hello -> check with-path
dnl SEARCH_PATH="/usr/local /usr" # これを変更することもできます
dnl SEARCH_FOR="/include/say_hello.h" # この
dnl を変更する可能性が高いです if test -r $ PHP_SAY_HELLO/$SEARCH_FOR; then # パラメータとして指定されたパス
dnl SAY_HELLO_DIR=$PHP_SAY_HELLO
dnl else # デフォルトのパスリストを検索
dnl AC_MSG_CHECKING([デフォルトパスのsay_hello ファイル用])
dnl for i in $SEARCH_PATH ; do
dnl if test -r $i/$SEARCH_FOR; then
dnl SAY_HELLO_DIR=$i
dnl AC_MSG_RESULT($i にあります)
dnl fi
dnl 完了
dnl fi
dnl
dnl if test -z "$SAY_HELLO_DIR";次に
dnl AC_MSG_RESULT([見つかりません])
dnl AC_MSG_ERROR([say_hello ディストリビューションを再インストールしてください])
dnl fi
dnl # --with-say_hello ->インクルード パスを追加
dnl PHP_ADD_INCLUDE($SAY_HELLO_DIR/include)
dnl # --with-say_hello -> lib とシンボルの存在を確認します
dnl LIBNAME=say_hello # これを変更することもできます
dnl LIBSYMBOL=say_hello # おそらくこれを変更する必要があります
dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
dnl [
dnl PHP_ADD_LIBRARY_WITH_PATH($LI) BNAME 、$SAY_HELLO_DIR/lib, SAY_HELLO_SHARED_LIBADD)
dnl AC_DEFINE(HAVE_SAY_HELLOLIB,1,[ ])
dnl ],[
dnl AC_MSG_ERROR([間違ったsay_hello libバージョンまたはlibが見つかりません])
dnl ],[
dnl -L$SAY_HELLO_DIR /lib -lm
dnl ])
dnl
dnl PHP_SUBST(SAY_HELLO_SHARED_LIBADD)
PHP_NEW_EXTENSION(say_hello,say_hello.c, $ext_shared)
fi

これは PHP Extension の原型であるため、明確でない限り、PHP Extension は公開されていません。各フィールドは、このセクションの文章で使用されるフィールドにのみ関連付けられています。これは、フィールドが多く、手作業で書き込む必要がなく、特定の所定のマクロ フィルを使用することができます。

7 番目のフィールド「name」、このフィールドはこの PHP 拡張機能の名前であり、この例では「say_hello」になります。 8 番目のフィールド「functions」は、この拡張で指定された関数の参照を保存します。特定の構造は再分析されません。興味のある友人は、対応するコードをここに書き込むことができます。宏。

第 9 から 12 の文字列はそれぞれ 4 つの関数を指しています。この 4 つの関数はそれぞれ「扩展モジュールの追加時」、「扩展モジュールの卸売時」、「每请要求開始時」および「この 4 つの関数は、主に対応するタイムマシンのリソースの割り当て、解放などの関連動作に使用される一種のメカニズムと見なすことができます。

13 番目のフィールド「info_func」も関数指向の 1 つであり、この指向の関数は phpinfo() の実行時に使用され、独自のモジュール情報を表示するために使用されます。

14 番目のフィールド「version」はモジュールのバージョンです。

(zend_module_entry の詳細についてはこちらを参照)

以上のフィールドが完了すると、「say_hello.c」内で自動的に生成された「say_hello_module_entry」のフレームコードが表示されます。

*/

zend_module_entry Say_hello_module_entry = {

#if ZEND_MODULE_API_NO >= 20010901

STANDARD_MODULE_HEADER,

#endif

"say_hello",

say_hello_functions,
PHP_MINIT(say_hello),

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


まず、マクロ「STANDARD_MODULE_HEADER」は最初の6フィールドを生成し、「STANDARD_MODULE_PROPERTIES」は「version」以降のフィールドを生成しますので、まだ心配する必要はありません。私たちが注目するいくつかのフィールドもマクロによって入力または生成されており、いくつかの関数のフレームワークも「say_hello.c」内の対応する場所に生成されています。ここで、いくつかのマクロのパラメータはすべて「say_hello」ですが、これはいくつかの関数の名前がす​​べて「say_hello」であることを意味するわけではなく、C 言語には関数名のオーバーロード機構がないことに注意してください。実際、PHP 拡張機能の開発プロセスでは、グローバル変数から関数定義、さらには戻り値に至るまで、Zend で事前に定義されたさまざまなマクロがほぼあらゆる場所で使用されます。 PHP のメカニズムは名前の競合などの問題を引き起こす可能性があり、これらのマクロは関数などの要素を内部名に変換しますが、これらはプログラマにとっては透過的です (マクロのコードを読まない限り)。私たちはさまざまなマクロやマクロを通じてプログラムします。私たちのために内部の多くのことを処理してください。

ここに書くと、私たちのタスクは明確です: まず、対応する時間に何かを処理する必要がある場合は、各インターセプト関数の内容を入力する必要があります。次に、say_hello の関数関数を記述し、say_hello_functions への参照を追加します。

phpinfo()コールバック関数を書く

say_hello 拡張機能はライフサイクルの各段階での操作を必要としないため、info_func の内容を記述するだけです。上記のように、この関数は拡張機能の情報を表示するために phpinfo() が実行されるときに自動的に呼び出されます。この関数を記述するには 4 つの関数が使用されます:

php_info_print_table_start() - phpinfo テーブルを開始します。パラメータはありません。

php_info_print_table_header()—出力テーブルヘッダー。最初のパラメータはヘッダーの列数を示す整数で、後続のパラメータは表示するテキストを指定するために使用される列数に等しい (char*) タイプのパラメータです。

php_info_print_table_row()—テーブルの内容を出力します。最初のパラメータは、この行の列数を示す整数で、後続のパラメータは、表示するテキストを指定するために使用される列数に等しい (char*) タイプのパラメータです。

php_info_print_table_end() - phpinfo テーブルを終了します。パラメータはありません。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/322589.html技術記事概要、次に dnl ここにテストの例をさらに書いてください... dnl # --with-say_hello - パスでチェック dnl SEARCH_PATH="/usr/local /usr" # この dnl SEARCH_FOR="/incl.. を変更することもできます。 .
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles