我正在开发一个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);
}
Run Code Online (Sandbox Code Playgroud)
代码工作正常,并做了预期的事情 - 它返回对象的myArrayProperty
.但是,我想优化这个过程.
myArrayProperty
存储一个可能很大的数组.并且RETURN_ZVAL()
宏复制该数组以返回值.复制过程需要花费大量时间来获取内存并复制所有数组值.同时,返回的数组通常用于只读操作.所以一个很好的优化是使用PHP的机制与引用计数,不要重复myArrayProperty
内容.相反我会提高refcount
的myArrayProperty
,只是返回指针.当使用PHP扩展中的变量时,这与通常使用的策略相同.
但是,似乎没有办法 - 你必须复制值才能从PHP扩展函数返回它.更改函数签名以通过引用返回值不是一个选项,因为它链接属性和返回值 - 即稍后更改返回值,也会更改属性.这不是一种可接受的行为.
无法参与引用计数看起来很奇怪,因为PHP中的代码相同:
function myMethod() {
{
return $this->myArrayProperty;
}
Run Code Online (Sandbox Code Playgroud)
通过引用计数机制进行优化.这就是我在StackOverflow上提出这个问题的原因,以防我错过了什么.
那么,有没有办法从PHP扩展中的函数返回一个数组,而不是在内存中复制数组?
问候,我已经创建了一个 angular 库,并且已经将它构建并推送到 gitlab 的私有仓库中,现在我需要在另一个项目中使用它
所以我尝试使用 package.json 中的以下行导入它
"my-core-lib": "git+ssh://git@gitlab.com:<username>/my-core-lib.git"
Run Code Online (Sandbox Code Playgroud)
但那是下载了整个 repo 并将其放在 node_modules 中,包括“dist”文件夹
我需要导入“dist”文件夹的内容,而不是整个 repo,例如:
"my-core-lib": "git+ssh://git@gitlab.com:<username>/my-core-lib.git/dist"
Run Code Online (Sandbox Code Playgroud)
提前致谢
我正在开发一个PHP扩展,使用C.到目前为止,我正在研究正确的参数验证,从PHP用户空间传递给扩展的函数.
该宏ZEND_BEGIN_ARG_INFO_EX
可用于向Zend Engine提供有关函数参数的信息.宏的第四个参数,命名为required_num_args
,让引擎自动控制参数的数量,从而消除了这个麻烦.但是,我找不到让它工作的方法:引擎总是运行扩展的函数而没有任何警告,即使PHP脚本没有传递足够的参数.
这是我对函数参数的定义:
ZEND_BEGIN_ARG_INFO_EX(test_func_swt_arginfo, 0, 0, 3)
ZEND_ARG_INFO(1, firstArg)
ZEND_ARG_ARRAY_INFO(0, secondArg, true)
ZEND_ARG_OBJ_INFO(1, thirdArg, SomeClass, false)
ZEND_END_ARG_INFO()
Run Code Online (Sandbox Code Playgroud)
这是我对函数的定义,由PHP扩展导出:
static const zend_function_entry test_func_functions[] = {
PHP_FE(sample_with_types, test_func_swt_arginfo)
PHP_FE_END
};
Run Code Online (Sandbox Code Playgroud)
这是我的功能:
PHP_FUNCTION(sample_with_types)
{
RETURN_TRUE;
}
Run Code Online (Sandbox Code Playgroud)
这是我运行的PHP脚本:
<?php
sample_with_types();
Run Code Online (Sandbox Code Playgroud)
预期结果:PHP显示错误/警告/异常,例如"没有足够的参数传递给函数" ; 该功能不执行.
实际结果:函数执行并返回true
.
如何正确配置函数参数结构,以便Zend Engine自动检查参数个数?或者我required_num_args
在ZEND_BEGIN_ARG_INFO_EX
宏观中误解了论证的目的?