小编And*_*kus的帖子

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

我正在开发一个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内容.相反我会提高refcountmyArrayProperty,只是返回指针.当使用PHP扩展中的变量时,这与通常使用的策略相同.

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

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

function myMethod() {
{
    return $this->myArrayProperty;
}
Run Code Online (Sandbox Code Playgroud)

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

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

php c php-extension php-internals

8
推荐指数
2
解决办法
1961
查看次数

来自 Git 存储库子目录的 `npm install`

问候,我已经创建了一个 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)

提前致谢

git npm npm-install angular angular-library

6
推荐指数
2
解决办法
3257
查看次数

如何使ZEND_BEGIN_ARG_INFO_EX控制参数数量,传递给PHP扩展?

我正在开发一个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_argsZEND_BEGIN_ARG_INFO_EX宏观中误解了论证的目的?

php c php-extension php-internals

5
推荐指数
1
解决办法
1725
查看次数