Heim > Artikel > Backend-Entwicklung > PHP-Erweiterung – C-Erweiterung zur Implementierung der fortlaufenden Protokollierung
Alles ist am Anfang schwierig, das stimmt! !
Bevor ich wirklich PHP-Erweiterungen entwickelte, hatte ich immer das Gefühl, dass die Entwicklung von PHP-Erweiterungen für mich eine sehr ferne Sache war. Obwohl ich einige CC-Grundlagen habe, war es immer noch sehr schwierig, den PHP-Quellcode zu lesen Diesmal habe ich mich schließlich dazu entschieden, eine PHP-Erweiterungsklassenbibliothek zu erstellen. Nachdem ich ein Wochenende lang daran gearbeitet hatte, habe ich schließlich eine frühere Protokollschreibklassenbibliothek in eine PHP-Erweiterung gekapselt Form. Dies kann als Einführung in die Entwicklung von PHP-Erweiterungen angesehen werden. Hier ist der Quellcode: eine Singleton-Modus-Protokollierungs-PHP-Erweiterung
Was ich entwickelt habe eine PHP-Erweiterung für die Protokollierung, mit Funktionen und Die PHP-Rolling-Logs der letzten Tage sind grundsätzlich gleich und werden auch im Singleton-Modus ausgeführt.
Notieren Sie einige Punkte, auf die bei der Entwicklung geachtet werden sollte:
Für Details können Sie sich meiner Meinung nach den besten Weg ansehen Wenn Sie nicht wissen, wie Sie ihn selbst überprüfen können, müssen Sie die ZVAL-Struktur verstehen. ZVAL ist eine im PHP-Kernel definierte Datenstruktur >
<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>
Einige Funktionen, die häufig bei der Entwicklung von Oberflächenbibliotheken verwendet werden
<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>
<code>centos虚拟机,64位 内存 1G CPU i5-2410M @ 2.30GHz #这个获取到的是我电脑的</code>
次数 | PHP代码 | PHP扩展 |
---|---|---|
第一次 | 8.83s | 6.13s |
第二次 | 8.60s | 6.14s |
平均 | 8.72s | 6.14s |
24.05.2015 15:10:45 Uhr
Das Urheberrecht dieses Artikels liegt für immer beim Autor (luluyrt@163.com). Nach dem Nachdruck ist jede Form des Nachdrucks verboten Der Artikel, der Autor und der Autor müssen auf der Artikelseite eindeutig angegeben werden, andernfalls behalten wir uns eine rechtliche Haftung vor.Das Obige stellt die PHP-Erweiterung C zur Implementierung der fortlaufenden Protokollierung vor, einschließlich einiger Aspekte des Inhalts. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.