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 修改zen-cart下单和付款流程以防止漏单
Mar 08 PHP
解析php中memcache的应用
Jun 18 PHP
解析php session_set_save_handler 函数的用法(mysql)
Jun 29 PHP
PHP屏蔽过滤指定关键字的方法
Nov 03 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
Feb 23 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
Sep 11 PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 PHP
Laravel中的Auth模块详解
Aug 17 PHP
php 使用mpdf实现指定字段配置字体样式的方法
Jul 29 PHP
laravel 实现根据字段不同值做不同查询
Oct 23 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 PHP
PHP大文件及断点续传下载实现代码
Aug 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 imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Python文件去除注释的方法
2015/05/25 Python
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
Golang与python线程详解及简单实例
2017/04/27 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Python time库基本使用方法分析
2019/12/13 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
使用OpenCV对车道进行实时检测的实现示例代码
2020/06/19 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
python opencv肤色检测的实现示例
2020/12/21 Python
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
供电工程专业求职信
2014/08/09 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
公司证明怎么写
2014/09/22 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
检察院起诉书
2015/05/20 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电