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开发规范手册之PHP代码规范详解
Jan 13 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
Jun 06 PHP
php生成图形验证码几种方法小结
Aug 15 PHP
PHP使用CURL获取302跳转后的地址实例
May 04 PHP
php中session与cookie的比较
Jan 27 PHP
PHP超全局数组(Superglobals)介绍
Jul 01 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 PHP
Laravel中前端js上传图片到七牛云的示例代码
Sep 04 PHP
PHP获取HTTP body内容的方法
Dec 31 PHP
PHP实现提取多维数组指定一列的方法总结
Dec 04 PHP
一文搞懂php的垃圾回收机制
Jun 18 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的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
简单谈谈php浮点数精确运算
2016/03/10 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
简单JS代码压缩器
2006/10/12 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
JavaScript中的setMilliseconds()方法使用详解
2015/06/11 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
深入分析Javascript事件代理
2016/01/30 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
Vue 封装防刷新考试倒计时组件的实现
2020/06/05 Javascript
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
详解Python的Django框架中的通用视图
2015/05/04 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
深入浅析Python中的yield关键字
2018/01/24 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
西部世纪.net笔试题面试题
2014/04/03 面试题
优秀研究生自我鉴定
2013/12/04 职场文书
业务员岗位职责范本
2013/12/15 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
幼儿园六一儿童节活动总结
2015/02/10 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
idea下配置tomcat避坑详解
2022/04/12 Servers