PHP擴充功能-C擴充實作滾動記錄日誌
前言
萬事起頭難,沒錯就是這樣! !
在沒有真正開發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>
<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查看內存洩漏情況,對不再需要的內存即使進行釋放,不然有可能在大量循環處理的時候出現記憶體佔用過多,導致報錯。
環境:
<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.60s | 6.14s | |
8.72s | 6.14s | |
可以看到使用PHP擴充的方式速度可以提升原來的1/4左右,哈哈,還不錯,我的程式碼可能還有很大的最佳化空間,加油努力~~ | 我將所有的程式碼放在了github上: | 一個單例模式的記錄日誌的PHP擴充 |
用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教學有興趣的朋友有幫助。
🎜

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
