php7扩展开发 一 获取参数
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_OPTIONAL | |
a | Z_PARAM_ARRAY(dest) | dest - zval* |
A | Z_PARAM_ARRAY_OR_OBJECT(dest) | dest - zval* |
b | Z_PARAM_BOOL(dest) | dest - zend_bool |
C | Z_PARAM_CLASS(dest) | dest - zend_class_entry* |
d | Z_PARAM_DOUBLE(dest) | dest - double |
f | Z_PARAM_FUNC(fci, fcc) | fci - zend_fcall_info, fcc - zend_fcall_info_cache |
h | Z_PARAM_ARRAY_HT(dest) | dest - HashTable* |
H | Z_PARAM_ARRAY_OR_OBJECT_HT(dest) | dest - HashTable* |
l | Z_PARAM_LONG(dest) | dest - long |
L | Z_PARAM_STRICT_LONG(dest) | dest - long |
o | 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 - int |
P | 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 - int |
S | 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
for remember