ホームページ >バックエンド開発 >PHPチュートリアル >PHP 拡張機能の開発 - カーネルの実行プロセスと拡張構造

PHP 拡張機能の開発 - カーネルの実行プロセスと拡張構造

WBOY
WBOYオリジナル
2016-06-13 12:16:03758ブラウズ

PHP 拡張機能の開発 - カーネルの実行プロセスと拡張機能の構造

拡張機能を開発する前に、PHP には次の 3 つの側面が含まれることを理解することが最善です。 🎜> SAPI

Zend VM
内部拡張



Zend VM は、JVM と同様に、各言語のコンパイル/実行の中核です。 。まず、それぞれのコードを中間コードにコンパイルします。PHP は通常オペコードと呼ばれ、Java は通常バイトコードと呼ばれます。違いは、PHP のオペコードが Zend VM の実行ユニットによって呼び出される対応する C 関数によって直接実行されることです。表示も保持もできませんが (キャッシュに保持できます)、通常は Java がクラス ファイルを生成して保持します。そしてこれがPHPインタープリターの名前の由来でもあるのかもしれません。実際、C/C などの比較的厳密なコンパイル言語と比較して、PHP および Java は、より多くのコンパイルおよびインタープリタ スタイルを組み合わせています。
    SAPI は、PHP コード サービスのコンパイル/実行を外部に提供するための Zend VM のメソッドおよび仕様と見なすことができます。 cli/cgi/fastcgi/apache_mod として他のプログラムと対話する場合でも、C/C などの他の言語に埋め込まれている場合でも、すべて SAPI の仕様を通じて実装できます。その重要なデータ構造の 1 つは sapi_module_struct(main/SAPI.h line 217) です
  • 内部拡張部分は Zend VM と SAPI 上に構築されたライブラリとみなすことができ、PHP 開発者にパフォーマンスと使いやすさを提供します。保証。 Java のさまざまなパッケージや Python のさまざまなモジュールにも同様の機能があります。違いは、PHP ではパフォーマンスのために C 拡張機能が使用されることですが、Python では _socket や _select などの JNI を介して実現できます。再利用)はネイティブの Python 実装ではありません。
  • ライフサイクル

各種 SAPI や PHP 自体のライフサイクルについては、後で詳しく説明する Apache などの他のコンポーネントと結合される場合があります。 PHP 拡張機能のライフサイクルについては、次の図を参照してください。このプロセスについてはネット上にたくさんの情報があるので、詳細は説明しません。拡張機能を開発するときに注意する必要があるいくつかの点は、図内の特定のノードにも対応する可能性があります。

グローバル変数の定義 (通常は zend_modulename_globals

リソース/クラス/定数を含むモジュールの初期化) /ini 設定などのモジュールレベルの初期化
単一のリクエストに関連する一部の初期化を含むリクエストの初期化

リクエストの終了、単一のリクエストに関連するデータ/メモリのクリーンアップ
モジュールのアンインストール、モジュール Data/memory


に関連するクリーンアップ 基本的にしなければならないことは、上記のプロセスに従い、関連する組み込み関数を実装し、独自のリソース/グローバル変数/クラス/関数などを定義することです。 。 Python などの他の言語を埋め込んだり、Apache などの他のコンポーネントに埋め込んだりする場合は、マルチプロセスとマルチスレッドに関連する問題に注意してください。


PHP 拡張構造


php-src/ext/ext_skel を使用して PHP 拡張フレームワークを生成します

より重要ですファイルは config.m4 (そしてもちろんソース コード) です。config.m4 ファイルは、モジュールと外部依存ライブラリを有効にするかどうかを示す phpize コマンドを使用して構成ファイルを生成するために使用できます。

<code class=" hljs avrasm">./ext_skel --extname=myext[[email&#160;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>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。