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 相关文章推荐
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
Nov 18 PHP
七款最流行的PHP本地服务器分享
Feb 19 PHP
php页面跳转代码 输入网址跳转到你定义的页面
Mar 28 PHP
php一些错误处理的方法与技巧总结
Aug 10 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
Sep 28 PHP
php中数据库连接方式pdo和mysqli对比分析
Feb 25 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
Apr 17 PHP
举例讲解PHP面对对象编程的多态
Aug 12 PHP
php好代码风格的阶段性总结
Jun 25 PHP
PHP基于单例模式编写PDO类的方法
Sep 13 PHP
PHP实现导出excel数据的类库用法示例
Oct 15 PHP
php可变长参数处理函数详解
Feb 22 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
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
浅析return false的正确使用
2013/11/04 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
2016/09/02 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
Django实现组合搜索的方法示例
2018/01/23 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
Python 将pdf转成图片的方法
2018/04/23 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
Django Haystack 全文检索与关键词高亮的实现
2020/02/17 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
python定义类的简单用法
2020/07/24 Python
Django nginx配置实现过程详解
2020/09/10 Python
简单介绍Object类的功能、常用方法
2013/10/02 面试题
交通事故委托书范本(2篇)
2014/09/21 职场文书
工人先进事迹材料
2014/12/26 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android