PHP 拡張機能開発メモ (2) 複数のソース コード ファイルの構成とコンパイル
開発プロセスでは、コードを読みやすく保守しやすくするために、スケルトンだけではなく、必ず複数のコード ファイルが必要です。 ext_skel によって生成されたファイル。この記事では、複数のコードファイルを扱う際に注意すべき点とその方法を中心に紹介します。
私のコード ファイルは次のとおりです (スラッシュは私の拡張子です)
<code class="language-c hljs "><span class="hljs-comment">// ext_skel 生成默认得模块相关的主要文件</span>php_slash.h <span class="hljs-comment">// 头文件</span>slash.c <span class="hljs-comment">// 源码文件</span>config.m4 <span class="hljs-comment">// 编译的时候需要修改的文件</span></code>
デフォルトで生成されるこのスケルトン ファイルでは、次の手順を実行するだけで、新しい展開を完了できます。
<code class="language-c hljs ">删除config.m4的第<span class="hljs-number">10</span>-<span class="hljs-number">12</span>行开头的注释dnlphpize./configuremake && make install</code>
上記の手順により拡張機能が完成しました。これは dl(“slash.so”); を通じてテストできます。クラスを書く場合は前回の記事で紹介しました。
以下では、新しいクラスとソース コード ファイルを追加し、それらをコンパイルおよび構成する方法を紹介します。
<code class="language-php hljs "><span class="hljs-variable">$httpUtil</span> = <span class="hljs-keyword">new</span> Slash_Http_Util();<span class="hljs-variable">$httpUtil</span>->getIv(); <span class="hljs-comment">// 会输出 HELLO</span></code>
<code class="language-c hljs "><span class="hljs-preprocessor">#ifndef SLASH_HTTP_UTIL_H</span><span class="hljs-preprocessor">#define SLASH_HTTP_UTIL_H</span><span class="hljs-keyword">extern</span> zend_class_entry *slash_http_util_ce;PHP_METHOD(slash_http_util, getIv);SLASH_MINIT_FUNCTION(http_util);<span class="hljs-preprocessor">#endif</span></code>
<code class="language-c hljs "><span class="hljs-preprocessor">#ifdef HAVE_CONFIG_H</span><span class="hljs-preprocessor">#include "config.h"</span><span class="hljs-preprocessor">#endif</span><span class="hljs-preprocessor">#include "php.h"</span><span class="hljs-preprocessor">#include "php_ini.h" /* for zend_alter_ini_entry */</span><span class="hljs-preprocessor">#include "php_slash.h"</span><span class="hljs-preprocessor">#include "slash_http_util.h"</span>zend_class_entry *slash_http_util_ce;PHP_METHOD(slash_http_util, getIv) { php_printf(<span class="hljs-string">"HELLO"</span>); RETURN_TRUE;}zend_function_entry slash_http_util_methods[] = { ZEND_ME(slash_http_util, getIv, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_FE_END};SLASH_MINIT_FUNCTION(http_util) { zend_class_entry ce; SLASH_INIT_CLASS_ENTRY(ce, SLASH_CN_HTTP_UTIL, slash_http_util_methods); slash_http_util_ce = zend_register_internal_class(&ce TSRMLS_CC); <span class="hljs-keyword">return</span> SUCCESS;}</code>
上記のコードは新しいクラスの追加を完了し、getIv というメソッドをクラスに追加します。次に、config.m4 構成ファイルを変更し、ファイルlash_http_util.cを追加する必要があります。 config.m4 の最後から 2 行目を開きます。ext_skel によって生成されるデフォルトのコードは
<code class="language-c hljs ">PHP_NEW_EXTENSION(slash,slash.c,$ext_shared)</code>
です。これを変更して、2 つの行の間にスペースがあることに注意してください。 *.c ファイル。句読点はありません。
<code class="language-c hljs ">PHP_NEW_EXTENSION(slash,slash.c slash_http_util.c, $ext_shared)</code>
config.m4 の変更が完了したら、slash.c ファイルを変更する必要があります。デフォルトでは、次のコードがこのファイルに含まれます。 🎜>
<code class=" hljs cs">PHP_MINIT_FUNCTION(slash){ <span class="hljs-comment">/* If you have INI entries, uncomment these lines REGISTER_INI_ENTRIES(); */</span> <span class="hljs-keyword">return</span> SUCCESS;}</code>
<code class=" hljs scss"><span class="hljs-function">PHP_MINIT_FUNCTION(slash)</span>{ <span class="hljs-comment">/* If you have INI entries, uncomment these lines REGISTER_INI_ENTRIES(); */</span> <span class="hljs-function">SLASH_STARTUP(http_util)</span>; return SUCCESS;}</code>
1. config.m4 ファイルを変更し、ソース コード ファイルを追加します。
2. config.m4 ファイルを変更した後、phpize を再実行する必要があります。 🎜>3. モジュール内で、この新しいクラスをロード関数の PHP_MINIT_FUNCTION に追加します。
上記のコードを完全にコピーすると、いくつかのマクロ (php_slash.h) をカスタマイズして名前を変更しているため、コンパイルできない可能性があります。実際の開発では、マクロを zend できます。
<code class="language-c hljs "><span class="hljs-preprocessor">#define SLASH_CN_HTTP_UTIL "Slash_Http_Util"</span><span class="hljs-comment">// {{{ php life cycle redefine</span><span class="hljs-preprocessor">#define SLASH_MINIT_FUNCTION(module) PHP_MINIT_FUNCTION(slash_##module)</span><span class="hljs-preprocessor">#define SLASH_MSHUTDOWN_FUNCTION(module) PHP_MSHUTDOWN_FUNCTION(slash_##module)</span><span class="hljs-preprocessor">#define SLASH_RINIT_FUNCTION(module) PHP_RINIT_FUNCTION(slash_##module)</span><span class="hljs-preprocessor">#define SLASH_RSHUTDOWN_FUNCTION(module) PHP_RSHUTDOWN_FUNCTION(slash_##module)</span><span class="hljs-preprocessor">#define SLASH_STARTUP(module) PHP_MODULE_STARTUP_N(slash_##module)(INIT_FUNC_ARGS_PASSTHRU)</span><span class="hljs-comment">// }}}</span><span class="hljs-comment">// {{{ class init mac</span><span class="hljs-preprocessor">#define SLASH_INIT_CLASS_ENTRY(ce, name, methods) INIT_CLASS_ENTRY(ce, name, methods)</span><span class="hljs-comment">// }}}</span></code>