この記事では、主に 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 サイトの他の関連記事を参照してください。