【发布时间】:2013-07-24 12:59:01
【问题描述】:
我正在开发一个 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 的refcount 并返回指向它的指针。这与在 PHP 扩展中处理变量时通常使用的策略相同。
但是,似乎没有办法做到这一点 - 您必须复制值才能从 PHP 扩展函数返回它。将函数签名更改为通过引用返回值不是一种选择,因为它将属性和返回值联系起来 - 即稍后更改返回值,也会更改属性。这是不可接受的行为。
无法进行引用计数看起来很奇怪,因为 PHP 中的代码相同:
function myMethod() {
{
return $this->myArrayProperty;
}
通过引用计数机制进行了优化。这就是我在 StackOverflow 上问这个问题的原因,以防我错过了什么。
那么,有没有办法从 PHP 扩展中的函数返回一个数组,而无需将数组复制到内存中?
【问题讨论】:
标签: php c php-extension php-internals