Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Erweiterung – C-Erweiterung zur Implementierung der fortlaufenden Protokollierung

PHP-Erweiterung – C-Erweiterung zur Implementierung der fortlaufenden Protokollierung

WBOY
WBOYOriginal
2016-08-08 09:23:441096Durchsuche

Vorwort

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

Entwicklung

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 >

So übergeben Sie Parameter an Funktionen
<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>

PHP-Erweiterung – C-Erweiterung zur Implementierung der fortlaufenden ProtokollierungEinige 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>
Hinweis
<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>
Achten Sie auf die Speicherfreigabe, um Speicherlecks zu verhindern. Nach Abschluss der Entwicklung habe ich festgestellt, dass ein Speicherleck vorliegt. Sie können valgrind verwenden, um die Speicherlecks zu überprüfen und den Speicher freizugeben Andernfalls kann es bei der Verarbeitung großer Schleifen zu einer übermäßigen Speichernutzung kommen, was zu einem Fehler führt.
  1. Schauen Sie sich auch den YAF-Quellcode von Bruder Niao an. Das hat mir in den frühen Tagen des Lernens sehr geholfen ".
  2. Sehen wir uns den Effekt an
Nachdem die Entwicklung abgeschlossen war, habe ich ein Skript geschrieben und es ausprobiert, wobei ich das Protokoll zyklisch 100.000 Mal ausgegeben habe (300.000 Mal, um genau zu sein, Debug, Msg, und jeweils 100.000 Mal irren) ), das Folgende ist die Umgebung und die Ergebnisse

Umgebung:


Sie können sehen, dass die Verwendung der PHP-Erweiterung die Geschwindigkeit um etwa 1/4 erhöhen kann Original, haha, nicht schlecht, mein Code. Möglicherweise gibt es viel Raum für Optimierung, also arbeite weiter hart ~~
<code>centos虚拟机,64位
内存 1G
CPU i5-2410M @ 2.30GHz #这个获取到的是我电脑的</code>
次数 PHP代码 PHP扩展
第一次 8.83s 6.13s
第二次 8.60s 6.14s
平均 8.72s 6.14s
Ich habe den gesamten Code auf Github gestellt:

Eine PHP-Erweiterung für die Protokollierung im Singleton-Modus

Referenzartikel

Verwenden Sie C/C, um Ihr PHP zu erweitern – Laruence

Detaillierte PHP-Variablenspeicherstruktur – Wen Daxia

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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn