摘要:内容均以php-5.6.14为例. 1. EXPECTED 和 UNEXPECTED 宏,用在判断条件的时候。 ./Zend/zend.h:390 #if (defined (__GNUC__) && __GNUC__ > 2 ) && !defined(DARWIN) && !defined(__
阅读全文
摘要:内容均以php-5.6.14为例. 函数中接收的字符串参数长度不包含结尾的0,在 zend_update_property 中,长度的参数是 int len,一般都使用 ZEND_STRL(NAME)自动填充字符串和长度,它的长度实现是 sizeof(NAME) - 1,它也不需要结尾的0; #un
阅读全文
摘要:内容均以php5.6.14为例. 假设有模块 foo,php_foo.h 和 foo.c 是固有文件,额外的C文件如果要加入编译,大致有五步。 1. 新增头文件 foo_bar.h #ifndef FOO_BAR_H #define FOO_BAR_H extern zend_class_entry
阅读全文
摘要:内容均以php5.6.14为例. 一. 封装函数时产生 memory leaks. [weichen@localhost www]$ php 2.php [122,3333] [Tue Jul 10 15:34:42 2016] Script: '/home/www/2.php' /home/wei
阅读全文
摘要:内容均以php5.6.14为例. 扩展中定义一个类有以下四步: #1. 声明一个存储类信息的指针. zend_class_entry *errs_ce; #2. 定义方法的参数信息,类的方法实现. ZEND_BEGIN_ARG_INFO_EX(errs_test_arginfo, 0, 0, 1)
阅读全文
摘要:内容均以php5.6.14为例. 从一个封装 uniqid 的例子来讲。 /* {{{ wrapper of uniqid */ PHP_FUNCTION(fox) { // #1. zval *prefix, *more = NULL; zval function, *params[2] = {0
阅读全文
摘要:内容均以php-5.6.14为例. 在看各种组合数据类型之前,有必要先熟悉下 Zend/zend_types.h 里面的自定义数据类型. #ifndef ZEND_TYPES_H // 防止多次 include 头文件导致预处理错误 #define ZEND_TYPES_H typedef unsi
阅读全文
摘要:内容均以php-5.6.14为例. 一. 函数结构 内核中定义一个php函数使用 PHP_FUNCTION 宏 包装,扩展也不例外,该宏在 ./main/php.h:343 有着一系列类似以 PHP 命名的 Zend 宏包装器,它们是: /* PHP-named Zend macro wrapper
阅读全文
摘要:内容均以php5.6.14为例. 要拥有一个PHP扩展的架子,使用源码中准备好的 /ext/ext_skel 工具,可以生成一个可运行的扩展骨架。 不加选项运行 ./ext_skel,可查看所有可用选项的帮助文字。 1) ./ext_skel --extname=myext(扩展名),自动生成扩展目
阅读全文