検索
ホームページバックエンド開発PHPチュートリアルPHP 拡張機能の開発 (1): はじめに、php extension_PHP チュートリアル

PHP 拡張機能の開発 (1): はじめに、php 拡張機能

PHP 拡張機能の開発に関する記事やブログは数多くありますが、より古典的なものは次のとおりです:

私は、この一連のブログ投稿で PHP 拡張機能の開発について学んだことと洞察を要約し、Linux システムで PHP 拡張機能を開発するために知っておくべき最も基本的な知識を簡単かつ明確に説明するつもりです。レベルが低いので間違いがあるかもしれませんがご指摘ください。

準備

まず、PHP ソース コードのコピーを取得し (Github からチェックアウトするか、公式 Web サイトから最新の安定バージョンをダウンロードできます)、コンパイルします。コンパイルを高速化するには、余分な拡張機能をすべて無効にすること (--disable-all オプションを使用) をお勧めしますが、デバッグ (--enable-debug オプションを使用) とスレッド セーフ (--enable-maintainer を使用) をオンにすることをお勧めします。 -zts)、ただし、拡張機能を公開するときにデバッグをオフにし、状況に応じてスレッド セーフをオンにするかどうかを選択する必要があります:

リーリー

これは必須ではないため、 --prefix オプション (または make install) を指定しなかったことに注意してください。 PHP を正常にコンパイルするには、いくつかの依存関係パッケージをインストールする必要がある場合がありますので、出力情報に注意してください。

コンパイルされた PHP 実行可能プログラムは、ソース コードの sapi ディレクトリにあります。将来的には、主に cli (コマンド ライン インターフェイス) 環境を使用することになります。 :

リーリー

便利なコマンドライン オプションがいくつかあります:

リーリー

拡張スケルトン

PHP のすべての公式拡張機能はソース コードの ext ディレクトリにあり、独自の拡張機能もこのディレクトリに配置できます。このディレクトリには、PHP 拡張機能のスケルトンを生成するために使用される ext_skel という名前のシェル スクリプトがあることに注意してください。このスクリプトを使用すると、PHP 拡張機能をすばやく作成できます。 リーリー

上記のコマンドは、myext という名前の拡張機能を作成するのに役立ちます。ソース コードは myext ディレクトリにあります。パラメーターを指定せずにスクリプトを実行すると、ヘルプ情報が出力され、スクリプトによって提供されるその他のオプションを確認できます。

次に拡張機能を完成させましょう。 myext ディレクトリに入り、config.m4 構成ファイルを編集し、PHP_ARG_ENABLE マクロ関数を見つけて、前の dnl コメント (合計 3 行) を削除します。ソース コードのルート ディレクトリに戻り、buildconf、configure、make コマンドを再実行します。

リーリー

拡張機能の読み込みステータスを出力するために ./configure --help | grep myext を使用したことに注意してください。以下の出力が表示されない場合は、戻って config.m4 ファイルを確認してください。 。

コードの大部分はすでにコンパイルされているため、このコンパイルは非常に高速になるはずです。 PHP には拡張機能をコンパイルする別の方法 (拡張機能を .so ファイルにコンパイルする動的リンクを使用する) がありますが、拡張機能を開発する場合は静的コンパイルを使用することをお勧めします。これにより、構成ファイルに拡張機能をロードする必要がなくなるためです。

すべてがうまくいけば、最初の拡張機能を実行する準備が整います:

リーリー

最初のコマンドは、拡張機能がロードされたことを示しています。 2 番目のコマンドは、ext_skel 拡張スケルトンによって自動的に作成された関数を実行します。もちろん、この関数は無意味ですが、この関数を

hello world に簡単に適応させることができます。

拡張機能を手動で作成する

ほとんどのチュートリアルでは、ext_skel 拡張スケルトンをプロトタイプとして使用して、拡張機能の開発を説明します。もちろん、このアプローチは非常に便利で高速です。しかし、私は個人的には拡張機能を純粋に手作業で開発することを好みます。なぜなら、あらゆる詳細を理解するのが簡単だからです。

拡張機能を手動で作成するには、まず ext ディレクトリに入り、拡張機能ディレクトリ myext2 を作成します。いくつかのファイルが必要です: config.m4、myext2.c、php_myext2.h。

まず、構成ファイル config.m4 を書きましょう:

リーリー

config.m4 は、実際には autoconf プログラムによって使用される構成ファイルです。Autoconf は autotools ツールボックスの重要なコンポーネントです。 autoconf の使用法を完全に紹介するには長い時間がかかりますが、幸いなことに、ここでの使用法は非常に簡単です。

PHP_ARG_ENABLE は、autoconf 用に PHP によって定義されたマクロ関数です。Myext2 はその最初のパラメータであり、最後の 2 つのパラメータは make と configure が実行されるときの表示にのみ使用されるため、必要なものを自由に記述できます。 [ ] は、autoconf 構文の二重引用符のように機能し、文字列をラップするために使用されます (2 番目のパラメーターにはスペースが含まれていますが、角括弧で囲む必要はないことに注意してください)。拡張機能がデフォルトでオンであるかオフであるかを示すために使用される 4 番目のパラメーターもあります (デフォルトは no)。

次の 3 行は、実際には PHP_MYEXT2 拡張モジュールが有効になっているかどうかを判断するためのシェル構文です。拡張モジュールが有効になっている場合 (--enable-myext2)、$PHP_MYEXT2 変数の値は no ではないため、PHP_NEW_EXTENSION マクロが実行されます。このマクロ関数は、autoconf 用に PHP によって定義された拡張構文でもあります。最初のパラメーターは拡張機能の名前でもあり、2 番目のパラメーターは拡張機能によってコンパイルされる C ファイルです。複数ある場合は、それらを順番に書き留めます。スペースで区切ります); 3 つのパラメータは $ext_shared に固定されます。

次に、php_myext2.h ヘッダー ファイルを作成します。このファイルの名前は、PHP 拡張機能の仕様である php_extension.h です。
<span> 1</span> <span>#ifndef PHP_MYEXT2_H
</span><span> 2</span> <span>#define</span> PHP_MYEXT2_H
<span> 3</span> 
<span> 4</span> <span>extern</span><span> zend_module_entry myext2_module_entry;
</span><span> 5</span> <span>#define</span> phpext_myext2_ptr &myext2_module_entry
<span> 6</span> 
<span> 7</span> <span>#define</span> PHP_MYEXT2_VERSION "0.1.0"
<span> 8</span> 
<span> 9</span> <span>/*</span><span> prototypes </span><span>*/</span>
<span>10</span> <span>PHP_FUNCTION(hello);
</span><span>11</span> 
<span>12</span> <span>#endif</span>  /* PHP_MYEXT2_H */

这里主要的代码是定义了名为phpext_myext2_ptr的宏,PHP底层通过该宏来引用我们的扩展。可以看出,该宏的命名同样是有规范的 — phpext_扩展名_ptr。而myext2_module_entry是我们稍后要在.c文件里定义的结构体,它的命名也是规范的 — 扩展名_module_entry。

此外我们还定义了一个标识我们扩展版本号的宏和一个函数原型(通过PHP_FUNCTION宏,PHP_FUNCTION宏函数的参数是外部可使用的函数名),稍后我们会来实现这个函数。

最后来看下myext2.c文件的实现:

<span> 1</span> #include <span>"</span><span>php.h</span><span>"</span>
<span> 2</span> #include <span>"</span><span>php_myext2.h</span><span>"</span>
<span> 3</span> 
<span> 4</span> <span>/*</span><span> {{{ myext2_functions[]
</span><span> 5</span> <span> *
</span><span> 6</span> <span> * Every user visible function must have an entry in myext2_functions[].
</span><span> 7</span>  <span>*/</span>
<span> 8</span> <span>static</span> <span>const</span> zend_function_entry myext2_functions[] =<span> {
</span><span> 9</span> <span>    PHP_FE(hello,       NULL)
</span><span>10</span> <span>    PHP_FE_END
</span><span>11</span> <span>};
</span><span>12</span> <span>/*</span><span> }}} </span><span>*/</span>
<span>13</span> 
<span>14</span> <span>/*</span><span> {{{ myext2_module_entry
</span><span>15</span>  <span>*/</span>
<span>16</span> zend_module_entry myext2_module_entry =<span> {
</span><span>17</span> <span>    STANDARD_MODULE_HEADER,
</span><span>18</span>     <span>"</span><span>myext2</span><span>"</span>,               <span>/*</span><span> module name </span><span>*/</span>
<span>19</span>     myext2_functions,       <span>/*</span><span> module functions </span><span>*/</span>
<span>20</span>     NULL,                   <span>/*</span><span> module initialize </span><span>*/</span>
<span>21</span>     NULL,                   <span>/*</span><span> module shutdown </span><span>*/</span>
<span>22</span>     NULL,                   <span>/*</span><span> request initialize </span><span>*/</span>
<span>23</span>     NULL,                   <span>/*</span><span> request shutdown </span><span>*/</span>
<span>24</span>     NULL,                   <span>/*</span><span> phpinfo </span><span>*/</span>
<span>25</span>     PHP_MYEXT2_VERSION,     <span>/*</span><span> module version </span><span>*/</span>
<span>26</span> <span>    STANDARD_MODULE_PROPERTIES
</span><span>27</span> <span>};
</span><span>28</span> <span>/*</span><span> }}} </span><span>*/</span>
<span>29</span> 
<span>30</span> <span>#ifdef COMPILE_DL_MYEXT2
</span><span>31</span> <span>ZEND_GET_MODULE(myext2)
</span><span>32</span> <span>#endif</span>
<span>33</span> 
<span>34</span> <span>/*</span><span> {{{ proto void hello()
</span><span>35</span> <span>   Print "hello world!" </span><span>*/</span>
<span>36</span> <span>PHP_FUNCTION(hello)
</span><span>37</span> <span>{
</span><span>38</span>     php_printf(<span>"</span><span>hello world!\n</span><span>"</span><span>);
</span><span>39</span> <span>}
</span><span>40</span> <span>/*</span><span> }}} </span><span>*/</span>

对比下扩展骨架创建的.c文件就会发现,我们的.c文件非常的简单,其实这些对一个最基本的扩展来说就已经足够了。

上面的代码是简单而清晰的,大部分注释已经很具说明性了。我们再简要概括下:

这里面涉及了一些宏,比如PHP_FE,PHP_FE_END,PHP_FUNCTION等等,完整介绍这些宏要到后续的博文中才可以,眼下最简单的办法就是记住这些宏。

注意到我们每一个文件的命名,变量的命名,空格和缩进,以及注释等都是非常规范的,遵循这些规范,可以使我们编写的代码和PHP本身的代码更加契合,我们也推荐你使用这样的规范来开发PHP扩展。

最后,编译运行我们的扩展:

$ ./buildconf --<span>force
$ .</span>/configure --help | <span>grep</span><span> myext2
  </span>--enable-<span>myext2           Enable myext2 support
$ .</span>/configure --disable-all --enable-myext2 --enable-debug --enable-maintainer-<span>zts
$ </span><span>make</span><span>

$ php</span>-dev -m | <span>grep</span><span> myext2
myext2
$ php</span>-dev -r <span>'</span><span>hello();</span><span>'</span><span>
hello world</span>!

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/960240.htmlTechArticlePHP扩展开发(1):入门,php扩展 有关PHP扩展开发的文章、博客已经很多了,比较经典的有: 我准备在此系列博文中总结我有关PHP扩展开发...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
誇大広告を超えて:今日のPHPの役割の評価誇大広告を超えて:今日のPHPの役割の評価Apr 12, 2025 am 12:17 AM

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPの弱い参照は何ですか、そしていつ有用ですか?PHPの弱い参照は何ですか、そしていつ有用ですか?Apr 12, 2025 am 12:13 AM

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

PHPで__invoke Magicメソッドを説明してください。PHPで__invoke Magicメソッドを説明してください。Apr 12, 2025 am 12:07 AM

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。

同時性については、PHP 8.1の繊維を説明します。同時性については、PHP 8.1の繊維を説明します。Apr 12, 2025 am 12:05 AM

繊維はPhp8.1で導入され、同時処理機能が改善されました。 1)繊維は、コルーチンと同様の軽量の並行性モデルです。 2)開発者がタスクの実行フローを手動で制御できるようにし、I/O集約型タスクの処理に適しています。 3)繊維を使用すると、より効率的で応答性の高いコードを書き込むことができます。

PHPコミュニティ:リソース、サポート、開発PHPコミュニティ:リソース、サポート、開発Apr 12, 2025 am 12:04 AM

PHPコミュニティは、開発者の成長を支援するための豊富なリソースとサポートを提供します。 1)リソースには、公式のドキュメント、チュートリアル、ブログ、LaravelやSymfonyなどのオープンソースプロジェクトが含まれます。 2)StackOverFlow、Reddit、およびSlackチャネルを通じてサポートを取得できます。 3)開発動向は、RFCに従うことで学ぶことができます。 4)コミュニティへの統合は、積極的な参加、コード共有への貢献、および学習共有への貢献を通じて達成できます。

PHP対Python:違いを理解しますPHP対Python:違いを理解しますApr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHP:それは死にかけていますか、それとも単に適応していますか?PHP:それは死にかけていますか、それとも単に適応していますか?Apr 11, 2025 am 12:13 AM

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

PHPの未来:適応と革新PHPの未来:適応と革新Apr 11, 2025 am 12:01 AM

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

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

メモ帳++7.3.1

メモ帳++7.3.1

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

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン