加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何从PHP扩展返回数组,而不将其复制到内存中?

发布时间:2020-12-13 13:20:15 所属栏目:PHP教程 来源:网络整理
导读:我正在开发一个 PHP扩展,其中一个对象方法需要返回一个数组zval. 该方法如下: ZEND_METHOD(myObject,myMethod){ zval **myArrayProperty; if (zend_hash_find(Z_OBJPROP_P(getThis()),"myArrayProperty",sizeof("myArrayProperty"),(void **) myArrayProper
我正在开发一个 PHP扩展,其中一个对象方法需要返回一个数组zval.

该方法如下:

ZEND_METHOD(myObject,myMethod)
{
    zval **myArrayProperty;
    if (zend_hash_find(Z_OBJPROP_P(getThis()),"myArrayProperty",sizeof("myArrayProperty"),(void **) &myArrayProperty) == FAILURE) {
        RETURN_FALSE;
    }
    RETURN_ZVAL(*myArrayProperty,1,0);
}

代码工作正常并做了预期的事情 – 它返回对象的myArrayProperty.但是,我想优化这个过程.

myArrayProperty存储一个数组,它可能非常大.并且RETURN_ZVAL()宏复制该数组以返回该值.复制过程需要花费大量时间来获取内存并复制所有数组值.同时,返回的数组通常用于只读操作.所以一个很好的优化是使用PHP的机制和引用计数,不要复制myArrayProperty内容.相反,我会增加myArrayProperty的引用计数,只返回指向它的指针.当使用PHP扩展中的变量时,这与通常使用的策略相同.

但是,似乎没有办法 – 你必须复制值才能从PHP扩展函数返回它.更改函数签名以通过引用返回值不是一个选项,因为它链接属性和返回值 – 即稍后更改返回值,也会更改属性.这不是一种可接受的行为.

无法参与引用计数看起来很奇怪,因为PHP中的代码相同:

function myMethod() {
{
    return $this->myArrayProperty;
}

通过引用计数机制进行优化.这就是我在StackOverflow上提出这个问题的原因,以防我错过了什么.

那么,有没有办法从PHP扩展中的函数返回一个数组,而不是在内存中复制数组?

如果函数返回值,则只能使用RETURN_ZVAL_FAST宏从PHP 5.6(当前主数据库)开始:
RETURN_ZVAL_FAST(*myArrayProperty);

如果函数返回by-reference(arginfo中的return_reference = 1),则可以使用以下代码返回:

zval_ptr_dtor(&return_value);
SEPARATE_ZVAL_TO_MAKE_IS_REF(myArrayProperty);
Z_ADDREF_PP(myArrayProperty);
*return_value_ptr = *myArrayProperty;

如果你的函数按值返回并且你使用的是PHP 5.5或更高版本,你仍然可以优化refcount = 1的情况:

if (Z_REFCOUNT_PP(myArrayProperty) == 1) {
    RETVAL_ZVAL(*myArrayProperty,1);
    Z_ADDREF_P(return_value);
    *myArrayProperty = return_value;
} else {
    RETVAL_ZVAL(*myArrayProperty,0);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读