2種類のPHP拡張。 Zend拡張VS PHPモジュール

画像


一般に拡張機能とは


PHPモジュール-通常のPHP拡張機能
このタイプには、PHPの大部分の拡張機能が含まれます。 extension=some_library.soを使用してphp.iniで接続されるのは、それらが何であるかです。


Zend拡張
このタイプの拡張機能は非常に少数ですが、需要は少なくありません。


この記事では、上からこれら2つのタイプの拡張機能の違いを確認します。


エンドユーザーの観点から。


接続方法のみが異なります。
通常の拡張機能は、次の指示に従ってphp.iniを介して接続されます。
extension=some_extension.so
Zend拡張機能:
zend_extension=some_extension.so


コマンドライン引数を介して接続する場合、通常の場合:
php -d extension=/path/extension.so
また、zend拡張機能の場合:
php -z /path/zend_extension.so


ただし、内部では非常に異なっています。


ここでは、ガソリンとディーゼルエンジンとの類推が非常に適しています。 ユーザーにとって唯一の違いは、タンクに注ぐ燃料の種類だけですが、実際には、これらは異なる動作原理と長所と短所を持つ2つの完全に異なる設計です。


タスクに関して


ほとんどの場合、標準の拡張機能は、新しいクラス、関数、定数などの追加など、言語の機能を拡張するために使用されます。 他の問題を解決するために使用されることはほとんどありません。 たとえば、PECL拡張機能Vulcan Logic Disassembler(vld)を使用すると、スクリプト用に生成されたオペコードを表示できます。


zend拡張機能は、仮想マシンの内部を可能な限り深くする必要がある場合に使用されます。 たとえば、スクリプトのデバッグやプロファイル作成、PHPのロジックの変更など。


PHPの拡張機能を以前に作成しておらず、突然把握した開発者の観点から


一般的な拡張機能の作成については、多くの記事で詳しく説明されています。 PHPソースコードに含まれているプロジェクトスケルトン生成ツールもあります。


Zend拡張の場合、これは存在しません。 良い記事はほとんどありません。 悪いものも。 PHP自体と、このタイプのいくつかの既存の拡張機能の両方のソースコードについて、長く思慮深い研究に備えてください。


ライフサイクルに関して


残念ながら、拡張機能のライフサイクルはその定義構造を完全に反映しているため、Cコードなしではできません。 ( 構造を省略形で表示します。記事の枠組みで必要なもののみ


標準の拡張機能は、 _zend_module_entry構造体( zend_module.h説明)によって定義されます


 struct _zend_module_entry { /* skipped */ int (*module_startup_func)(INIT_FUNC_ARGS); /* MINIT() */ int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); /* MSHUTDOWN() */ int (*request_startup_func)(INIT_FUNC_ARGS); /* RINIT() */ int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); /* RSHUTDOWN() */ void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); /* PHPINFO() */ /* skipped */ void (*globals_ctor)(void *global); /* GINIT() */ void (*globals_dtor)(void *global); /* GSHUTDOWN */ int (*post_deactivate_func)(void); /* PRSHUTDOWN() */ /* skipped */ }; 

Zend拡張機能は、 _zend_extension構造体( zend_extensions.h説明)によって定義されます


 struct _zend_extension { /* skipped */ startup_func_t startup; /* STARTUP() */ shutdown_func_t shutdown; /* SHUTDOWN() */ activate_func_t activate; /* ACTIVATE() */ deactivate_func_t deactivate; /* DEACTIVATE() */ message_handler_func_t message_handler; /* MESSAGE_HANDLER()    */ op_array_handler_func_t op_array_handler; /*           .    */ /*  ,  ,     ,  *        */ statement_handler_func_t statement_handler; /*    */ fcall_begin_handler_func_t fcall_begin_handler; /*    */ fcall_end_handler_func_t fcall_end_handler; /*    */ op_array_ctor_func_t op_array_ctor; /*    OPArray */ op_array_dtor_func_t op_array_dtor; /*    OPArray */ int (*api_no_check)(int api_no); /* API_NO_CHECK() */ int (*build_id_check)(const char* build_id); /* BUILD_ID_CHECK() */ /* skipped */ }; 

そして今、あなたはすでにライフサイクルで写真を見せることができます。


画像


ボーナス ハイブリッド拡張


はい そのような機会があります。


なぜ必要なのでしょうか?


  1. zend拡張機能によって提供されるフルコントロールが必要であり、さらに、新しい機能を登録する必要があります。
  2. 何らかの理由で、一般的に考えられるすべてのフックを使用する必要がありました。
  3. 拡張機能の読み込み順序を制御する必要があります。 たとえば、 OPCacheロードする前に起動する必要があります。

便利なリンク


簡単なZend拡張機能の作成例
PHPの内部構造に関する非常に役立つリソース
PHPソース



Source: https://habr.com/ru/post/J358714/


All Articles