第一个有点作用的PHP扩展
C/C++去开发PHP扩展
我觉的对于PHP开发人员来说,学的东西非常杂,也非常多,当然了开发PHP扩展也是一个必须要掌握的技能,这里膜拜下大神鸟哥(Laruence)~
今天要开发的第一个有点功能的扩展,主要作用是记录日志的时候生成日志前面的日期部分
1 | <code>#即使当前的时间,年-月-日 时:分:秒 时间戳.微妙数 [2015-05-19 20:39:32 1432039172.968199]</code>
|
登入後複製
php扩展函数前奏
首先生成”骨架“:
1 | <code>1. 进入php源码src/ext目录下面2. 运行./ext_skel --extname=mytest3. 进入src/ext/mytest/目录4. 在编写扩展的时候要先修改下config.me文件的10-12行,去掉前面的dnl注释,这个网上一搜一大把。</code>
|
登入後複製
在头文件php_mttest.h中声明要编写的php扩展函数名
1 | <code>PHP_FUNCTION(get_log_title);#PHP_FUNCTION是PHP内核中声明的一个宏#define PHP_FUNCTION ZEND_FUNCTION
|
登入後複製
上面的声明函数宏展开后是:
1 | <code>void zif_get_log_title( int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC)</code>
|
登入後複製
在mytest.c中的zend_function_entry声明中添加get_log_title函数的声明
1 | <code> const zend_function_entry logs_functions[] = { PHP_FE(confirm_logs_compiled, NULL) PHP_FE(get_log_title, NULL) PHP_FE_END };#编写函数PHP_FUNCTION(get_log_title){ struct timeval tv; time_t rawtime; struct tm *timeinfo; char *formatinfo; time(&rawtime); timeinfo = localtime(&rawtime); gettimeofday (&tv, NULL); spprintf(&formatinfo, 0, "[%4d-%02d-%02d %d:%d:%d %d.%d]" , 1900 + timeinfo->tm_year, 1 + timeinfo->tm_mon, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, tv.tv_sec, tv.tv_usec); RETURN_STRING(formatinfo, 1);}</code>
|
登入後複製
这里还要看个宏RETURN_STRING
1 | <code>#define RETURN_STRING(s, duplicate) { RETVAL_STRING(s, duplicate); return ; }
|
登入後複製
因此,RETURN_STRING(formatinfo, 1)展开后为:
1 | <code> do { const char *__s=(formatinfo); zval *__z = (return_value);
|
登入後複製
编译测试
1 | <code>编译的时候需要安装好的php,比如我的php安装在/usr/local/php/目录下面cd mytest;
|
登入後複製
输出下面内容的话,恭喜你成功了
1 | <code>[[email protected ] logs]# php -r 'var_dump(get_log_title());' && datestring(39) "[2015-05-19 22:52:29 1432047149.755613]" 2015年 05月 19日 星期二 22:52:29 CST</code>
|
登入後複製
5/19/2015 10:54:38 PM
本文版权归作者iforever(luluyrt@163.com)所有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。