PHP7扩展开发-FAST_ZPP

来源:转载

PHP内部函数使用 zend_parse_parameters() API 接受参数,将输入参数转换成c变量,这个函数使用类似scanf()函数的参数解释方法,通过一个字符串来定义输入参数的个数和类型,例如(“s” - for string, “l” for long),不幸的是,每次调用这个函数时都要对这个这个字符串进行解析,这会加重性能开销。

例如,在一下wordpress的首页,zend_parse_parameters()函数占用6%的cpu运行时间,在一些简单的函数 is_string() 或者 ord() zend_parse_parameters() 几乎占用将近90%的开销。

zend_parse_parameters()参数说明:
第一个参数,参数个数。一般就使用ZEND_NUM_ARGS(),不需要改变。
第二个参数,格式化字符串。这个格式化字符串的作用就是,指定传入参数与PHP内核类型的转换关系。

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "al|zb", &input, &offset, &z_length, &preserve_keys) == FAILURE) { return;}

FAST ZPP

在PHP7中新提供的方式。是为了提高参数解析的性能。对应经常使用的方法,建议使用FAST ZPP方式。
使用方式:
以ZEND_PARSE_PARAMETERS_START(1, 2)开头。
第一个参数表示必传的参数个数,第二个参数表示最多传入的参数个数。
以ZEND_PARSE_PARAMETERS_END();结束。
中间是传入参数的解析。

ZEND_PARSE_PARAMETERS_START(2, 4) Z_PARAM_ARRAY(input) Z_PARAM_LONG(offset) Z_PARAM_OPTIONAL Z_PARAM_ZVAL(z_length) Z_PARAM_BOOL(preserve_keys)ZEND_PARSE_PARAMETERS_END();

新API涵盖了现有API的所有可能性。下表显示了老说明符和新宏之间的对应关系。

specifier Fast ZPP API macro args| Z_PARAM_OPTIONALa Z_PARAM_ARRAY(dest) dest - zval*A Z_PARAM_ARRAY_OR_OBJECT(dest) dest - zval*b Z_PARAM_BOOL(dest) dest - zend_boolC Z_PARAM_CLASS(dest) dest - zend_class_entry*d Z_PARAM_DOUBLE(dest) dest - doublef Z_PARAM_FUNC(fci, fcc) fci - zend_fcall_info, fcc - zend_fcall_info_cacheh Z_PARAM_ARRAY_HT(dest) dest - HashTable*H Z_PARAM_ARRAY_OR_OBJECT_HT(dest) dest - HashTable*l Z_PARAM_LONG(dest) dest - longL Z_PARAM_STRICT_LONG(dest) dest - longo Z_PARAM_OBJECT(dest) dest - zval*O Z_PARAM_OBJECT_OF_CLASS(dest, ce) dest - zval*p Z_PARAM_PATH(dest, dest_len) dest - char*, dest_len - intP Z_PARAM_PATH_STR(dest) dest - zend_string*r Z_PARAM_RESOURCE(dest) dest - zval*s Z_PARAM_STRING(dest, dest_len) dest - char*, dest_len - intS Z_PARAM_STR(dest) dest - zend_string*z Z_PARAM_ZVAL(dest) dest - zval* Z_PARAM_ZVAL_DEREF(dest) dest - zval*+ Z_PARAM_VARIADIC('+', dest, num) dest - zval*, num int* Z_PARAM_VARIADIC('*', dest, num) dest - zval*, num int

参考:

https://wiki.php.net/rfc/fast_zpp
https://yq.aliyun.com/articles/69523?spm=5176.8091938.0.0.g3PyCC

分享给朋友:
您可能感兴趣的文章:
随机阅读: