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 相关文章推荐
php5数字型字符串加解密代码
Apr 24 PHP
PHP CLI模式下的多进程应用分析
Jun 03 PHP
制作安全性高的PHP网站的几个实用要点
Dec 30 PHP
PHP strtotime函数用法、实现原理和源码分析
Feb 04 PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 PHP
php防止sql注入简单分析
Mar 18 PHP
php+MySql实现登录系统与输出浏览者信息功能
Jul 01 PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 PHP
php调用云片网接口发送短信的实现方法
Oct 25 PHP
php查看一个变量的占用内存的实例代码
Mar 29 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 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
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
很酷的javascript loading效果代码
2008/06/18 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
python中将字典转换成其json字符串
2014/07/16 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
python实现黑客字幕雨效果
2018/06/21 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
python双端队列原理、实现与使用方法分析
2019/11/27 Python
pycharm安装及如何导入numpy
2020/04/03 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
厨房领班竞聘演讲稿
2014/04/23 职场文书
销售业务员岗位职责
2015/02/13 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
学校运动会感想
2015/08/10 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
MySQL注入基础练习
2021/05/30 MySQL
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python