最初は何事も大変です、そうです! !
実際に PHP 拡張機能を開発する前は、CC++ の基礎はある程度持っていましたが、PHP 拡張機能の開発は非常に遠いものだと感じていました。そのために、今回は最終的に PHP 拡張クラス ライブラリを構築することにしました。週末に取り組んだ後、最終的に以前のログ書き込みクラス ライブラリを PHP 拡張フォームにカプセル化しました。 PHP 拡張機能の開発への入門としてここで共有します。これはソース コードです。シングルトン モードでログインするための PHP 拡張機能です。
私が開発したのは、ログを作成するための PHP 拡張機能です。基本的には数日前の PHP ローリング ログと同じで、これもサンプル モードで実行されます。
開発中に注意すべき点をいくつか記録します。
ここではほんの一部ですが、詳細については、ソースコードを参照してください。自分でやり方がわからない人は確認してみてください、記憶が深まります
<code>//定义在Zend/zend_types.h:55 和 Zend/zend.h:322行 typedef struct _zval_struct zval; struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount; zend_uchar type; /* active type */ zend_uchar is_ref; }; typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value; //其中的zval.type表示变量的类型,基本类型有下面几种,定义在Zend/zend.h:583中 #define IS_NULL 0 #define IS_LONG 1 #define IS_DOUBLE 2 #define IS_BOOL 3 #define IS_ARRAY 4 #define IS_OBJECT 5 #define IS_STRING 6 //部分常用的zval相关函数或者宏,定义在Zend/zend_operators.h:441行 Z_LVAL_P(zval_p) //获取zval_p指针所指向的zval结构的值,值得类型为LONG Z_STRVAL_P(zval_p)</code>
<code>PHP扩展中接受参数的时候通过函数zend_parse_parameters,类似下面的形式进行传参: zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &msg, &msg_len); 第二个参数是要传入参数类型的列表,有下面规范</code>
<code>从PHP5.3开始, zend_parse_paramters_函数新增了如下几个新的类型描述符: f - function or array containing php method call info (returned as zend_fcall_info and zend_fcall_info_cache) H - array or HASH_OF(object) (returned as HashTable) L - long, limits out-of-range numbers to LONG_MAX/LONG_MIN (long) Z - the actual zval (zval**)</code>
<code>zend_declare_property_null(mylogs_ce, ZEND_STRL("level"), ZEND_ACC_PRIVATE TSRMLS_CC); //类似上面的函数是类进行初始化的时候设置变量 zend_declare_class_constant_long(mylogs_ce, ZEND_STRL("LOG_DEBUG"), 0 TSRMLS_CC); //类似上面的函数是类型进行初始化的时候设置常量 zend_read_property(mylogs_ce, instance, ZEND_STRL("level"), 0 TSRMLS_CC); //上面的是从实例instance中读取变量的值 zend_hash_find(&ce->constants_table, ZEND_STRS("LOG_DEBUG"), (void **)&_level); //上面的是从mylogs_ce这个类中读取常量 zend_update_property_long(mylogs_ce, instance, ZEND_STRL("level"), level TSRMLS_CC); //上面的是从instance中读取变量level</code>
PHPコード | PHP拡張機能 | |
---|---|---|
8.83秒 | 6.13秒 | |
8.60秒 | 6.14秒 | |
8.72秒 | 6.14秒 |
すべてのコードを github に置きました:
シングルトン モード ロギング PHP 拡張機能
参考記事
In - Depth PHP 変数ストレージ構造 - Wen Daxia
5/24/2015 3:10:45 PMこの記事の著作権は作者 ifforever (luluyrt@163.com) に帰属します。著者の同意なしに記事を掲載することは禁止されており、著者と原文へのリンクを記事ページのわかりやすい位置に表示する必要があります。そうでない場合、当社は法的責任を追及する権利を留保します。
上記では、ローリング ロギングを実装するための PHP extension-C 拡張機能をその内容も含めて紹介していますが、PHP チュートリアルに興味のある友人にとって役立つことを願っています。