PHP扩展编写点滴 技巧收集


Posted in PHP onMarch 09, 2010

红色部分是我的注释。
更多信息参看:

1.常用的通用功能已经封装好了,在如zen_API.h 头文件中,不用费力查看内部细节,浪费时间。(参考:Extending and Embedding PHP 的附录A)
2.在terminal中运行测试程序,可以看到扩展的内部错误输出,这一点对于解决内存泄漏问题尤其重要。(编译一个debug 的 lib)
3.开发过程中修改Makefile中的“CFLAGS = -g -O2”,去掉优化选项,增加-Wall和-pedantic,便于调试和显示编译警告;
4.某zval*,但其strval非拷贝的,不可用zval_ptr_dtor(zval**),要用efree(void*)。
5.terminal中的$_SERVER['PWD']有值,但是无法通过zend_getenv()取得,原因应该是该值无意义或不可靠。
6.调用“导出函数”,可利用INTERNAL_FUNCTION_PARAM_PASSTHRU传参;声明的非导出函数可通过INTERNAL_FUNCTION_PARAM使用“导出函数”的参数。
7.注意:RETURN_TYPE用在选择分之和循环等处时,最好置于花括号中,
或者不用分号,因为:#define RETURN_BOOL(b) { RETVAL_BOOL(b); return; }。
8.如果函数的参数是引用的,且非标量,要先析构,以防内存泄露。
9.抛出异常前最好判断EG(exception)中是否已经存在异常,否则会造成内存泄露。
10.当Web服务器API是ISAPI (IIS)的时候,zend_getenv函数是不起作用的。
11.向zend_stack_push()传入数据指针,实际存储(copy)的是该指针指向的数据,换句话说,传入的应该是要存储的数据的指针。
ZEND_API int zend_stack_push(zend_stack *stack, void *element, int size);
ZEND_API int zend_stack_top(zend_stack *stack, void **element);
其中,size == sizeof(*element);
类似地,zend_hash也是如此,比较zend_hash_update和zend_hash_find。
12.使用add_assoc_zval(HashTable*, const char*, zval*)存储的是zval*,而非zval,因此,
存储用户传入的参数时候,要先拷贝一份新的zval,否则会发生不可预料的事情。
13.zval_dtor(zval*)释放变量及其内部的引用内存,zval_ptr_dtor(zval**)先检查refcount
再决定是否调用zval_dtor(zval*),zval_copy_dtor(zval*)仅执行深层的拷贝,即只拷贝
起内部引用的内存,而不拷贝zval;

14.如使用VC编译win的动态链接库,而且代码中调用了zend函数,如zend_getenv,在zend.h中定义为:

extern "C" {
extern ZEND_API char *(*zend_getenv)(char *name, size_t name_len TSRMLS_DC);
}
需要引入该函数,如要使用ZEND_API,需要事先取消LIBZEND_EXPORTS(包括VC“设置”中的预处理定义),或者使用ZEND_DLIMPORT,
ZEND_DLIMPORT char *(*zend_getenv)(char *name, size_t name_len TSRMLS_DC);
下面取自:zend_config.w32.h

#ifdef LIBZEND_EXPORTS 
# define ZEND_API __declspec(dllexport) 
#else 
# define ZEND_API __declspec(dllimport) 
#endif 
#define ZEND_DLEXPORT __declspec(dllexport) 
#define ZEND_DLIMPORT __declspec(dllimport)

executor_globals_id也需要作如下声明:
ZEND_DLIMPORT int executor_globals_id;
(这个比较有用,如果你要手工编译某些扩展的时候,比如我在编译sqlite3这个扩展的时候,就遇到这个问题。)
PHP 相关文章推荐
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
Jul 01 PHP
php5.3 注意事项说明
Jul 01 PHP
一个PHP的远程图片抓取函数分享
Sep 25 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
CI框架中$this->load->library()用法分析
May 18 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
PHP使用两个栈实现队列功能的方法
Jan 15 PHP
PHP PDOStatement::closeCursor讲解
Jan 30 PHP
PHP PDOStatement::setAttribute讲解
Feb 01 PHP
php 修改zen-cart下单和付款流程以防止漏单
Mar 08 #PHP
PHP 最大运行时间 max_execution_time修改方法
Mar 08 #PHP
php ss7.5的数据调用 (笔记)
Mar 08 #PHP
phpmyadmin 常用选项设置详解版
Mar 07 #PHP
PHPMYADMIN 简明安装教程 推荐
Mar 07 #PHP
THINKPHP+JS实现缩放图片式截图的实现
Mar 07 #PHP
PHP用mysql数据库存储session的代码
Mar 05 #PHP
You might like
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
php实现微信支付之退款功能
2018/05/30 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
VueJS全面解析
2016/11/10 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
Python socket编程实例详解
2015/05/27 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
浅谈python3中input输入的使用
2019/08/02 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
乡镇办公室工作决心书
2014/03/11 职场文书
关于环保的建议书400字
2014/03/12 职场文书
开工仪式策划方案
2014/05/23 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
2014年创卫工作总结
2014/11/24 职场文书
教师工作态度自我评价
2015/03/05 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
实习指导老师意见
2015/06/04 职场文书
身份证丢失证明
2015/06/19 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python