首頁  >  文章  >  後端開發  >  PHP擴充功能-C擴充實作滾動記錄日誌

PHP擴充功能-C擴充實作滾動記錄日誌

WBOY
WBOY原創
2016-08-08 09:23:441047瀏覽

前言

萬事起頭難,沒錯就是這樣! !

在沒有真正開發PHP擴充之前,一直覺得PHP擴充開發對我來說是一個很遙遠的事情,雖然自己有些CC++基礎,但是看PHP源碼的時候還是很吃力,現在看來主要還是沒有下決心搞這個,這次終於下決心搞一個php擴充類別庫,搞了一個週末,終於把之前的一個寫日誌的類別庫封裝為php擴充的形式了,這也算是開發PHP擴充入門了,這裡跟大家分享分享,這個是原始碼:一個單例模式的記錄日誌的PHP擴充

開發

我開發的是一個PHP擴充的形式進行日誌記錄,功能和前幾天的PHP滾動日誌基本上一致,也是單例模式運作。

記錄下開發中要注意的幾點:

這裡只是很少一部分,具體的可以看我的源代碼,我覺得最好的學習方式就是看源碼了,遇到不會的不懂得自己去查,記憶更深刻.

了解zval結構,zval是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>

PHP擴充功能-C擴充實作滾動記錄日誌

<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>
r
    注意內存的釋放,防止內存洩漏,我在開發完成之後,發現存在內存洩漏情況,可以利用valgrind查看內存洩漏情況,對不再需要的內存即使進行釋放,不然有可能在大量循環處理的時候出現記憶體佔用過多,導致報錯。

  1. 還有就是多看看例子,鳥哥的YAF源碼可以多參考參考,這個幫了我很多,學習的初期就是「照貓畫虎」。
看看效果

開發完成之後,寫了個腳本試了下,循環輸出日誌10w次(準確的說是30w,debug、msg、err各10w次),以下是環境和結果

環境:

<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.60s6.14s平均8.72s6.14s參考文章
可以看到使用PHP擴充的方式速度可以提升原來的1/4左右,哈哈,還不錯,我的程式碼可能還有很大的最佳化空間,加油努力~~ 我將所有的程式碼放在了github上: 一個單例模式的記錄日誌的PHP擴充
用C/C++PHP —— Laruence

用C/C++PHP —— Laruence

用C/C++PHP —— Laruence

用C/C++PHP —— Laruence

用C/C++PHP變數儲存結構-文大俠

5/24/2015 3:10:45 PM

本文版權歸作者iforever(luluyrt@163.com) 所有,未經作者本人同意禁止任何形式的轉載,轉載文章之後必須在文章頁面明顯位置給予作者和原文連接,否則保留追究法律責任的權利。

以上就介紹了PHP擴充功能-C擴充實作滾動記錄日誌,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn