PHP 7拡張開発チュートリアルのHello World実装方法の例

4315 ワード

PHP 7拡張開発チュートリアルのHello World実装方法の例を示した.皆さんに参考にしてあげます.具体的には以下の通りです.
一、PHPソースコードのダウンロード
PHP拡張を開発するには、まずPHPのソースコードをダウンロードする必要があります.一方、私たちの拡張は一般的にPHP自身が定義した関数とマクロを使用するため、一方で、公式に提供されたツールを利用して作業量を減らすことができます.
PHP-7.0.2をダウンロードしました.住所は:http://cn2.php.net/get/php-7.0.2.tar.gz.
ソース圧縮パッケージを解凍し、tar xzf php-7.0.2.tar.gz、Zendとextの2つのディレクトリに注目するだけです.
ZendディレクトリにはPHPのZend Engineソースコードが含まれています.関数やマクロの定義は簡単に見る必要があります.
extディレクトリにはPHPオリジナルの拡張と、私たちが独自の拡張を開発する際に利用できるツールが含まれています.Linuxの下でext_を使用します.skel、Windowsでext_を使用skel_win32.php
二、ext_の使用skelツール
よく知っているcurl、json、mbstring、simplexml、socketsなどの拡張が含まれています.まだ使ったことも聞いたこともない拡張もたくさんあります.気にしないでください.まず、私たちが最もよく知っているcurlを開けてみましょう.config.m 4プロファイルがあり、php_があります.curl.h,curl_file.cなどのソースコード、いくつかの中間ファイル、最後にtestsディレクトリがあり、curl拡張ユニットテストが入っています.config.m 4,php_に注目curl.h,curl_file.cでいいです.最も簡単なシーンでは、この3つのファイルは拡張のすべての構成部分です.
開けて勝手に見て、あまり複雑ではありませんが、自分で似たようなことを書くのは頭が痛いです.この時、私が前に言ったextを使う必要があります.skelツールです.このツールもextディレクトリの下で実行します../ext_skel--helpは、いくつかのパラメータを見ることができます.私たちが使っているのは--extname=moduleだけです.ここには自分が開発した拡張子の名前を記入します.各パラメータの役割を深く理解するには、ここを参照してください.http://php.net/manual/en/internals2.buildsys.skeleton.php

./ext_skel --extname=hello

extディレクトリの下にhelloディレクトリが1つ増えています.私たちの後続の仕事はこのディレクトリの下にあります.ツールは私たちのために自動的にいくつかのファイルを生成しました.
config.m 4プロファイル
PHP拡張を開発するには、Cコードを書く前に、ここを構成しておきます.詳細なコメントの説明を開くと、dnlはコメント構文です.
拡張が外部依存に使用されている場合は、--with-helloオプションを構成します.そうしないと、--enable-helloオプションを構成し、次の3行のdelコメントを削除します.

PHP_ARG_ENABLE(hello, whether to enable hello support,
Make sure that the comment is aligned:
[ --enable-hello      Enable hello support])

PHP_ARG_WITHとPHP_ARG_ENABLEの2つのマクロはconfigureオプションを構成するために使用され、1つの構成には外部依存が必要であり、もう1つの構成には外部依存は必要ありません.
設定された内容は、後でconfigure --helpを実行すると表示されます.
php_hello.hヘッダファイル
C音声のようなヘッダファイルには、カスタム構造と関数宣言が含まれており、このdemoでは一時的に変更する必要はありません.
hello.cコードファイル
本当の論理コードはこのファイルにあります.後で詳しく説明します.
三、コードを書く
さあ、ここまでやっとコードを書き始めます.hello.cファイルを開きます.
拡張されたエントリ全体がzend_module_entryという構造、具体的な定義はZendディレクトリの下のzend_modules.hファイルには、全部で10数個の属性があり、すばやくスキップし、私たちはしばらく「hello world」しか必要ありません.

zend_module_entry hello_module_entry = {
  STANDARD_MODULE_HEADER,
  "hello",
  hello_functions,
  PHP_MINIT(hello),
  PHP_MSHUTDOWN(hello),
  PHP_RINIT(hello),    /* Replace with NULL if there's nothing to do at request start */
  PHP_RSHUTDOWN(hello),  /* Replace with NULL if there's nothing to do at request end */
  PHP_MINFO(hello),
  PHP_HELLO_VERSION,
  STANDARD_MODULE_PROPERTIES
};

STANDARD_MODULE_HEADERは前の6つの属性を実現してくれました
「hello」は拡張子の名前です
hello_functionsは拡張に含まれるすべてのメソッドの集合である.
次の5つのマクロは、それぞれ5つの拡張特定のメソッドを表します.
PHP_HELLO_VERSIONは拡張バージョン番号であり、ヘッダファイルに定義されている
STANDARD_MODULE_PROPERIESは残りの属性を実現してくれました
しばらくは修正する必要はありませんが、これが入り口であることを知っていればいいです.この入り口に沿って、拡張に方法を追加する方法を見続けます.hello_functions[]メソッド配列には、メソッドconfirmの例が既に存在します.hello_compiled、私たちはそれを参考に私たちの方法を書きますhello_world

const zend_function_entry hello_functions[] = {
  PHP_FE(confirm_hello_compiled, NULL)    /* For testing, remove later. */
  PHP_FE(hello_world, NULL)
  PHP_FE_END /* Must be the last line in hello_functions[] */
};

まず拡張メソッド配列にhello_を追加しますworld、そしてhelloを定義します.world.confirm_が見つかりましたhello_compiledメソッド定義の場所は、その下にひょうたんでひょうたん、php_printfはZend Engineのprintfメソッドです.

PHP_FUNCTION(hello_world)
{
  php_printf("Hello World!
"); RETURN_TRUE; }
四、コンパイルインストール
最后に私达の拡张をコンパイルしてインストールして、PHPの拡张をインストールしたことがある学友は见ないで、経験がないのは参考にすることができます.
phpize

./configure
make
make install

PHPの拡張ディレクトリにはhello.soというファイルがすでにあり、php.iniに拡張の構成を追加しました

extension = hello.so

五、テスト
test.phpメソッドを書くと、スクリプトを実行すると「Hello World!」が表示されます.

 
 
PHPに関する詳細について興味のある読者は、「PHP拡張開発チュートリアル」、「phpオブジェクト向けプログラム設計入門チュートリアル」、「php+mysqlデータベース操作入門チュートリアル」、「PHPネットワークプログラミングテクニック総括」および「php一般データベース操作テクニック要約」を参照してください.
本論文で述べたように、皆さんのPHPプログラムの設計に役に立ちますように.