PHP扩展写技术集
更多的信息:
1。常用的通用功能已封装。在zen_api。h头文件,没有精力去检查内部的细节而浪费时间。(参考:扩展和嵌入PHP附录A)
2。为了在终端中运行测试程序,您可以看到扩展的内部错误输出,这对于解决内存泄漏问题尤为重要。
三.在发展的过程中,CFLAGS = G - O2在Makefile进行了改进,优化选项去掉,墙和迂腐的加入,和编译调试和易显示警告。
4。一个变量,但其strval是无法复制的,zval_ptr_dtor(zval **)是不可用的,和饱和(void *)是用。
_server美元'pwd'} {在5.terminal有价值,但不能通过zend_getenv(),因为价值是无意义的或不可靠的。
6,调用派生类函数可以使用internal_function_param_passthru传递参数;申报非导出函数可以用来求出参数的功能,通过internal_function_param。
7。注:return_type最好是放在括号中使用时,循环的选择,等等。
或不使用分号,因为#定义return_bool(b){ retval_bool(B);返回;}。
8。如果函数的参数是非标量的,首先要对结构进行分析,以防止内存泄漏。
前9。抛出异常,最好判断是否有例外(如异常),否则将导致内存泄漏。
10。当Web服务器API是ISAPI(IIS),这zend_getenv功能不工作。
11、数据指针传递给zend_stack_push(),和实际的存储(复制),指针指向的数据,换句话说,传入的指针应该是存储数据的指针。
zend_api int zend_stack_push(zend_stack *堆栈,void *元素,数组的大小);
zend_api int zend_stack_top(zend_stack *堆栈,无效**元);
其中,大小= sizeof(*元);
同样的,同样是真实的zend_hash,相比zend_hash_update和zend_hash_find。
12。使用add_assoc_zval(哈希表*,const char *,zval *)来存储机制,没有机制,所以,
当你将一个用户的输入参数,你需要复制一个新的机制,否则无法预料的事情会发生。
13.zval_dtor(zval *)释放变量及其内部参考记忆,和zval_ptr_dtor(zval * *)检查引用计数的第一
然后决定是否要叫zval_dtor(zval *),和zval_copy_dtor(zval *)只执行一个深拷贝,即只复制
内部参考的记忆,而不是一个复制机制;
14。动态链接库的胜利是用VC编译,和Zend函数在调用的代码,如zend_getenv,定义为禅:
externC{
外部zend_api char *(* zend_getenv)(char *的名字,size_t name_len tsrmls_dc);
}
我们需要介绍这个功能。例如,如果我们想用zend_api,我们需要取消libzend_exports提前,包括预处理定义在VC中的设置,或使用zend_dlimport。
zend_dlimport char *(* zend_getenv)(char *的名字,size_t name_len tsrmls_dc);
以下是来自:zend_config。W32。H
复制代码代码如下所示:
# ifdef libzend_exports
#定义zend_api __declspec(dllexport)
其他#
#定义zend_api __declspec(dllimport)
# endif
#定义zend_dlexport __declspec(dllexport)
#定义zend_dlimport __declspec(dllimport)
executor_globals_id还需要作出以下声明:
zend_dlimport int executor_globals_id;
(这是有用的,如果你想手动编译的一些扩展,例如,当我编写程序的扩展,这是一个问题。)