PHP 拡張機能の開発 - カーネルの実行プロセスと拡張機能の構造
内部拡張Zend VM は、JVM と同様に、各言語のコンパイル/実行の中核です。 。まず、それぞれのコードを中間コードにコンパイルします。PHP は通常オペコードと呼ばれ、Java は通常バイトコードと呼ばれます。違いは、PHP のオペコードが Zend VM の実行ユニットによって呼び出される対応する C 関数によって直接実行されることです。表示も保持もできませんが (キャッシュに保持できます)、通常は Java がクラス ファイルを生成して保持します。そしてこれがPHPインタープリターの名前の由来でもあるのかもしれません。実際、C/C などの比較的厳密なコンパイル言語と比較して、PHP および Java は、より多くのコンパイルおよびインタープリタ スタイルを組み合わせています。
グローバル変数の定義 (通常は zend_modulename_globals
リソース/クラス/定数を含むモジュールの初期化) /ini 設定などのモジュールレベルの初期化単一のリクエストに関連する一部の初期化を含むリクエストの初期化リクエストの終了、単一のリクエストに関連するデータ/メモリのクリーンアップ
モジュールのアンインストール、モジュール Data/memory
に関連するクリーンアップ 基本的にしなければならないことは、上記のプロセスに従い、関連する組み込み関数を実装し、独自のリソース/グローバル変数/クラス/関数などを定義することです。 。 Python などの他の言語を埋め込んだり、Apache などの他のコンポーネントに埋め込んだりする場合は、マルチプロセスとマルチスレッドに関連する問題に注意してください。
PHP 拡張構造
より重要ですファイルは config.m4 (そしてもちろんソース コード) です。config.m4 ファイルは、モジュールと外部依存ライブラリを有効にするかどうかを示す phpize コマンドを使用して構成ファイルを生成するために使用できます。
<code class=" hljs avrasm">./ext_skel --extname=myext[[email protected] ~/software/needbak/php-<span class="hljs-number">5.5</span><span class="hljs-number">.20</span>/ext <span class="hljs-number">12</span>:<span class="hljs-number">24</span>]$==> ls myext/config<span class="hljs-preprocessor">.m</span>4 config<span class="hljs-preprocessor">.w</span>32 CREDITS EXPERIMENTAL myext<span class="hljs-preprocessor">.c</span> myext<span class="hljs-preprocessor">.php</span> php_myext<span class="hljs-preprocessor">.h</span> tests</code>
<code class=" hljs bash">//config.m4//如果你的扩展依赖其他外部库dnl PHP_ARG_WITH(myext, <span class="hljs-keyword">for</span> myext support,dnl Make sure that the comment is aligned:dnl [ --with-myext Include myext support])//扩展不依赖外部库dnl PHP_ARG_ENABLE(myext, whether to enable myext support,dnl Make sure that the comment is aligned:dnl [ --enable-myext Enable myext support])//寻找并包含头文件<span class="hljs-keyword">if</span> test <span class="hljs-string">"<span class="hljs-variable">$PHP_MYEXT</span>"</span> != <span class="hljs-string">"no"</span>; <span class="hljs-keyword">then</span> dnl Write more examples of tests here... dnl <span class="hljs-comment"># --with-myext -> check with-path</span> dnl SEARCH_PATH=<span class="hljs-string">"/usr/local /usr"</span> <span class="hljs-comment"># you might want to change this</span> dnl SEARCH_FOR=<span class="hljs-string">"/include/myext.h"</span> <span class="hljs-comment"># you most likely want to change this</span> dnl <span class="hljs-keyword">if</span> test -r <span class="hljs-variable">$PHP_MYEXT</span>/<span class="hljs-variable">$SEARCH_FOR</span>; <span class="hljs-keyword">then</span> <span class="hljs-comment"># path given as parameter</span> dnl MYEXT_DIR=<span class="hljs-variable">$PHP_MYEXT</span> dnl <span class="hljs-keyword">else</span> <span class="hljs-comment"># search default path list</span> dnl AC_MSG_CHECKING([<span class="hljs-keyword">for</span> myext files <span class="hljs-keyword">in</span> default path]) dnl <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-variable">$SEARCH_PATH</span> ; <span class="hljs-keyword">do</span> dnl <span class="hljs-keyword">if</span> test -r <span class="hljs-variable">$i</span>/<span class="hljs-variable">$SEARCH_FOR</span>; <span class="hljs-keyword">then</span> dnl MYEXT_DIR=<span class="hljs-variable">$i</span> dnl AC_MSG_RESULT(found <span class="hljs-keyword">in</span> <span class="hljs-variable">$i</span>) dnl <span class="hljs-keyword">fi</span> dnl <span class="hljs-keyword">done</span> dnl <span class="hljs-keyword">fi</span> dnl dnl <span class="hljs-keyword">if</span> test -z <span class="hljs-string">"<span class="hljs-variable">$MYEXT_DIR</span>"</span>; <span class="hljs-keyword">then</span> dnl AC_MSG_RESULT([not found]) dnl AC_MSG_ERROR([Please reinstall the myext distribution]) dnl <span class="hljs-keyword">fi</span> dnl <span class="hljs-comment"># --with-myext -> add include path</span> dnl PHP_ADD_INCLUDE(<span class="hljs-variable">$MYEXT_DIR</span>/include) //加载的lib位置 dnl <span class="hljs-comment"># --with-myext -> check for lib and symbol presence</span> dnl LIBNAME=myext <span class="hljs-comment"># you may want to change this</span> dnl LIBSYMBOL=myext <span class="hljs-comment"># you most likely want to change this </span> dnl PHP_CHECK_LIBRARY(<span class="hljs-variable">$LIBNAME</span>,<span class="hljs-variable">$LIBSYMBOL</span>, dnl [ dnl PHP_ADD_LIBRARY_WITH_PATH(<span class="hljs-variable">$LIBNAME</span>, <span class="hljs-variable">$MYEXT_DIR</span>/<span class="hljs-variable">$PHP_LIBDIR</span>, MYEXT_SHARED_LIBADD) dnl AC_DEFINE(HAVE_MYEXTLIB,<span class="hljs-number">1</span>,[ ]) dnl ],[ dnl AC_MSG_ERROR([wrong myext lib version or lib not found]) dnl ],[ dnl -L<span class="hljs-variable">$MYEXT_DIR</span>/<span class="hljs-variable">$PHP_LIBDIR</span> -lm dnl ]) dnl dnl PHP_SUBST(MYEXT_SHARED_LIBADD) PHP_NEW_EXTENSION(myext, myext.c, <span class="hljs-variable">$ext_shared</span>)<span class="hljs-keyword">fi</span></code>