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模拟HTTP认证
Oct 09 PHP
计数器详细设计
Oct 09 PHP
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
Sep 16 PHP
php实现文件下载简单示例(代码实现文件下载)
Mar 10 PHP
PHP源码分析之变量的存储过程分解
Jul 03 PHP
php正则匹配html中带class的div并选取其中内容的方法
Jan 13 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
Sep 28 PHP
php创建无限级树型菜单
Nov 05 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
Aug 17 PHP
PHP上传图片、删除图片简单实例
Nov 12 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
Jul 10 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
星际争霸中的热键
2020/03/04 星际争霸
php轻松实现中英文混排字符串截取
2014/05/28 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
js自动下载文件到本地的实现代码
2013/04/28 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
JavaScript对数组进行随机重排的方法
2015/07/22 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
浅谈layui 绑定form submit提交表单的注意事项
2019/10/25 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
Python二分法搜索算法实例分析
2015/05/11 Python
Python中的rfind()方法使用详解
2015/05/19 Python
用Python逐行分析文件方法
2019/01/28 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
python中_del_还原数据的方法
2020/12/09 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
共产党员公开承诺践诺书
2014/05/28 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android
Java 定时任务技术趋势简介
2022/05/04 Java/Android