hnwの日記

PHP extensionとZend extensionの違い

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の初期化処理が呼ばれていることがわかります。

続きを読む