PHPのextensionにはPHP extensionとZend extensionという2種類があります。これらの違いが何なのか、PHPの実装レベルから調べてみました。
PHPのextensionについて
PHPのextensionには2種類が存在します。これらは次のようにphp.iniでロード指定する構文が異なります。
extension=extension.so zend_extension=/path/to/extension.so
本稿では「extension=」でロードされるものをPHP extension、「zend_extension=」でロードされるものをZend extensionと呼びます。これらはPHPのソースコード中ではそれぞれmoduleとextensionと呼ばれているので注意してください。
代表的なZend extensionとしてはXdebugとZend OPcacheがあげられます。意外に思う方がいらっしゃるかもしれませんが、APCやxhprofのようにPHPの深い部分に干渉するものもPHP extensionで実現されています。
両者のよく言われる違いは、Zend extensionのロード指定はフルパスで書く必要があるということです。本稿では深追いしませんが、ちょっと不親切ですよね。
extensionのロードされるタイミング
各extensionはどのようなタイミングで読み込まれるのでしょうか。
PHP 5.5.0で試したところ、PHP extensionの初期化処理(PHP_MINIT_FUNCTION)が先に実行され、Zend extensionの初期化処理(zend_extension_entry.startup)は後から行われました。また、各extension同士については、iniでの出現順に実行されました。
ソースコード上ではmain/main.c中の下記の部分がextensionの初期化処理に対応しています。zend_startup_modules()の後にzend_startup_extensions()が呼ばれており、PHP extensionの初期化処理の後でZend extensionの初期化処理が呼ばれていることがわかります。