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中几种常见安全设置详解
Apr 06 PHP
解析php中memcache的应用
Jun 18 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
Aug 09 PHP
浅谈php安全性需要注意的几点事项
Jul 17 PHP
PHP语法自动检查的Vim插件
Aug 11 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
Jan 04 PHP
php+flash+jQuery多图片上传源码分享
Jul 27 PHP
php 使用html5实现多文件上传实例
Oct 24 PHP
Laravel实现表单提交
May 07 PHP
php数值转换时间及时间转换数值用法示例
May 18 PHP
php从数据库中读取特定的行(实例)
Jun 02 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 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初学者头疼问题总结
2006/07/08 PHP
ADODB类使用
2006/11/25 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
js和jquery批量绑定事件传参数一(新猪猪原创)
2010/06/23 Javascript
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
vue基础之事件v-onclick="函数"用法示例
2019/03/11 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:奇迹哥卡尔秀翻全场
2017/03/28 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python发布模块的步骤分享
2014/02/21 Python
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
django Admin文档生成器使用详解
2019/07/22 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
雪山饭庄的创业计划书范文
2014/01/18 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
食堂标语大全
2014/06/11 职场文书
小班教师个人总结
2015/02/05 职场文书