PHP拡張の基礎学習

小云云
小云云オリジナル
2018-01-25 17:18:451587ブラウズ

この記事では、主に PHP 拡張機能を最初から作成する方法を紹介します。お役に立てれば幸いです。

PHPはC言語で書かれています。すべての PHPer には、拡張機能を作成したいという内なる衝動があります。しかし、適切なエントリーポイントが不足しています。 GoogleでPHP拡張機能の開発を検索すると、ほとんどがコピペ記事で、中には操作もせずにブログに載せている人もいます。ただし、優れたチュートリアルがいくつかありますが、それらはすべて PHP 5 時代の製品であり、多くの隠れた落とし穴があります。ゆっくりとピットを踏んでいく過程を記録し、他の人にとっての「チュートリアル」になるかもしれません。

拡張機能を生成する

多くの人が多くのオンラインチュートリアルを見たことがあると思います。それらのほとんどは、次のコマンドを実行するように教えています: $./ext_skel--extname=extname。ただし、PHP ソース コードのクローンを作成すると、master ブランチの下に ext/ext_skel ファイルがないことがわかります。

PHPのソースコードを直接ダウンロードするか、リリースされたバージョンでダウンロードした場合は、このコマンドを実行できます

$ cd ext
$ ./ext_skel --extname=extname

masterブランチ直下にいる場合は、ext_skel.phpファイルのみです, この時、このPHPファイルを直接実行することができます

$ cd ext
$ php ext_skel.php --ext extname

masterブランチ直下に開発したので、デフォルトでは以下の操作は全てmasterブランチ配下になります。

拡張機能を生成すると、4 つのファイルと 1 つのフォルダーが表示されます。この段階では、.c ファイルと .h ファイルの 2 つのファイルを使用するだけで済みます。

小さな落とし穴

拡張機能を生成した後、それをコンパイルしてみることができます

$ phpize
$ ./configure
$ make &&make test

コンパイル中に警告が表示されることに気づくと驚くでしょう。

warning:implicitdeclaration of function
'ZEND_PARSE_PARAMETERS_NONE'isinvalid inC99 [-Wimplicit-function-declaration]
ZEND_PARSE_PARAMETERS_NONE();
^

1warning generated.

次に、make test を実行すると、1 つのテストが失敗したことがわかります。そうです、スクリプトによって生成されたファイルは、実際には私たち自身のテストに不合格でした。変だと思いますか?具体的な警報内容を見ていきましょう。関数 ZEND_PARSE_PARAMETERS_NONE が見つかりません。ファイルを確認すると、15 行目にそれが見つかりました。おそらく関数名を見れば、それが何を意味するか推測できるでしょう。そこで、PHP のソースコードを検索してみました。しかし、そのようなマクロ定義を見つけました。

#ifndefzend_parse_parameters_none
#definezend_parse_parameters_none()
zend_parse_parameters(ZEND_NUM_ARGS(),"")
#endif

元の大文字を置き換えると、警告は表示されなくなります。これは役人が我々に小さな穴を掘ったとも言える。大文字のマクロ定義はありますが、なぜエラーが報告されるのかわかりません。

関数を定義する

ほとんどの人が拡張機能を作成するとき、少なくとも 1 つの関数を実装したいと考えていると思います。拡張機能を作成するには、いくつかのグローバル変数が必要なだけではありません (霧

ここでは、PHP が提供する関数を提供します)。便利なマクロ PHP_FUNCTION も生成されたコードで定義されています。たとえば、PHP_FUNCTION(name) は最終的に voidzif_name(zend_execute_data*execute_data,zval) に変換されます。同時に、そのような配列が定義されていることがわかります

constzend_function_entry cesium_functions[]={
PHP_FE(cesium_test1,arginfo_cesium_test1)
PHP_FE(cesium_test2,arginfo_cesium_test2)
PHP_FE_END
};
constzend_function_entry cesium_functions[]={
PHP_FE(cesium_test1,arginfo_cesium_test1)
PHP_FE(cesium_test2,arginfo_cesium_test2)
PHP_FE(name,NULL)
PHP_FE_END
};

最後にセミコロンやカンマを追加しないでください。最後に、この関数を出力できます

PHP_FUNCTION(name)
{
php_printf("Hellon");
}

。コンパイルしてインストールした後、この関数を使用できます。

関連する推奨事項:

PHP 拡張機能用 Tencent CMEM のコンパイル

PHP 拡張機能用の拡張フレームワークの自動生成

PHP 拡張機能の作成方法

以上がPHP拡張の基礎学習の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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