>  기사  >  백엔드 개발  >  PHP 확장 - 롤링 로깅을 구현하는 C 확장

PHP 확장 - 롤링 로깅을 구현하는 C 확장

WBOY
WBOY원래의
2016-08-08 09:23:441052검색

서문

모든 것은 처음이 어렵죠, 그렇죠! !

개발

로깅을 위한 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>
참고
<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>
메모리 누수를 방지하려면 메모리 릴리스에 주의하세요. 개발을 완료한 후 메모리 누수가 발생했다는 사실을 발견했습니다. Valgrind를 사용하여 메모리 누수를 확인하고 해당 메모리를 릴리스할 수 있습니다. 더 이상 필요하지 않습니다. 그렇지 않으면 대규모 루프 처리 중에 과도한 메모리 사용이 발생하여 오류가 발생할 수 있습니다.

  1. 또 다른 것은 더 많은 예제를 보는 것입니다. Niao 형제의 YAF 소스 코드는 학습 초기에 많은 도움이 되었습니다. 그리고 호랑이를 그렸어요."
  2. 효과를 보자

개발이 완료된 후 스크립트를 작성하여 사용해 보았는데, 주기적으로 로그를 10만번(정확히는 30만번, debug, msg, 과 err 각각 100,000) ), 다음은 환경과 결과입니다

환경:


<code>centos虚拟机,64位
内存 1G
CPU i5-2410M @ 2.30GHz #这个获取到的是我电脑的</code>
PHP 확장을 사용하면 속도가 이전 버전의 약 1/4 정도 빨라지는 것을 볼 수 있습니다. 원본, ㅎㅎ 나쁘지 않아요, 내 코드 최적화할 여지가 많을 수 있으니 열심히 해주세요~~
次数 PHP代码 PHP扩展
第一次 8.83s 6.13s
第二次 8.60s 6.14s
平均 8.72s 6.14s

모든 코드는 github에 올렸습니다:

로그인용 PHP 확장 싱글톤 모드

참고 기사

C/C++로 PHP 확장 - Laruence

심층 PHP 변수 저장 구조 - Wen Daxia

2015년 5월 24일 오후 3시 10분 45초

이 기사의 저작권은 저자(luluyrt@163.com)에게 있습니다. 기사를 재인쇄한 후 어떠한 형태의 재인쇄도 금지됩니다. , 저자와 저자는 기사 페이지에 명확하게 명시되어야 합니다. 그렇지 않으면 당사는 법적 책임을 추구할 권리를 갖습니다.

위 내용은 내용의 측면을 포함하여 롤링 로깅을 구현하기 위한 PHP 확장-C 확장을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.