标签: php-internals

PHP MongoDB驱动程序的Cursor如何缓冲结果集?

当对mongodb进行查询时,它的光标如何处理内存中的结果集?光标是否一次检索与查询匹配的所有文档?或者它一次检索1个文件?或者他们缓冲?还是有一个我不知道的不同解决方案?

如果它是缓冲解决方案,它们如何存储在服务器/客户端上?客户端在本地保留多少数据?

php mongodb php-internals

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

如何使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
查看次数

为什么不支持将PHP函数导入当前命名空间

根据PHP文档

PHP命名空间支持三种别名或导入:别名类名,别名接口名和别名命名空间名.请注意,不支持导入函数或常量.

有没有人知道为什么导入函数或常量不受支持的历史或技术背景?

php php-internals

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

PHP引擎是否优化循环中的匿名函数?

我有一个数组存储对单个匿名函数的多个引用:

$fns = array();
//some code
$fn = function(){
    echo 'this is closure 12345... < 67890';
    // etc etc..
};
for($x=12345; $x<67890; ++$x){
    $fns[$x] = $fn;
}
Run Code Online (Sandbox Code Playgroud)

可以看出,我们只创建了一个匿名函数.

如果我们把函数声明放在循环中怎么办?:

$fns = array();
//some code
for($x=12345; $x<67890; ++$x){
    $fns[$x] = function(){
        echo 'this is closure 12345... < 67890';
        // etc etc..
    };
}
Run Code Online (Sandbox Code Playgroud)

引擎是否足够智能以识别只需要创建一个对象?

上面的代码是仅创建一个对象还是每次迭代创建一个对象?

(问题针对HHVM和Zend Engine.)

php closures anonymous-function php-internals hhvm

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

为什么foreach将refcount增加2而不是1?

NikiC在另一个帖子中说:

在[foreach]迭代之前,$array"软复制"用于foreach.这意味着没有实际的副本,但只有zval的refcount $array增加到2.

但是,我的测试代码显示了不同的结果:

$array = array(0, 1, 2);
xdebug_debug_zval('array'); // refcount=1, is_ref=0
                            // so far so good
foreach ($array as $key => $value) {
    xdebug_debug_zval('array'); // refcount=3, is_ref=0
}                               // why is refcount 3 instead of 2?
Run Code Online (Sandbox Code Playgroud)

只需查看代码,我们最多可以看到两个数组变量.

为什么要引用引用计数3

运行2后为什么不引用refcount foreach

php foreach xdebug php-internals

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

在php中的foreach循环中增加数组元素?

请考虑以下代码:

<?php
$arr = array();
$arr['b'] = 'book';
foreach($arr as $key=>$val) {
   print "key=>$key\n";
   if(!isset($arr['a']))
      $arr['a'] = 'apple';
}
?>
Run Code Online (Sandbox Code Playgroud)

它没有显示'a'.foreach如何使用hash-table(数组)来遍历每个元素.如果实现列表,为什么我不能在运行时添加更多?

请不要告诉我,我可以使用基于数字的索引来帮助计算.

php arrays php-internals

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

为什么在PHP中作为数组访问空值不会生成警告?

我遇到了一个错误,其中返回的DB结果应该是一个数组,但是由于SQL查询中的一个小故障,在一个实例中,DB包装器正确返回null.不幸的是,代码没想到(= bug).

但是,当将null值作为数组访问时,我很惊讶地看到PHP没有发出警告.有谁知道这是设计还是有一个解释我错过了?

显示我的意思的示例:

$ php -a
Interactive shell

> echo phpversion() . PHP_EOL;
5.4.26

php > echo $test['value'];
PHP Notice:  Undefined variable: test in php shell code on line 1

php > $test = 'string';
php > echo $test['value'];
PHP Warning:  Illegal string offset 'value' in php shell code on line 1

php > $test = null;
php > echo $test['value'];
Run Code Online (Sandbox Code Playgroud)

我希望最后一个语句能够生成警告.

php sql arrays php-internals

5
推荐指数
0
解决办法
837
查看次数

PHP使用语句命名空间

也许这是一个奇怪的问题,但我无法解决你写的时内部在php内部发生的事情:

use garcha\path\class;
Run Code Online (Sandbox Code Playgroud)

我不是在询问命名空间的用途,而是关于那个语句本身,即使它没有分配任何内存,我的意思是,当你甚至为某个类提供别名时:

use garcha\path\class as withNewName;
Run Code Online (Sandbox Code Playgroud)

它存放在哪里?或者它如何记住这些名字?它只在编译时发生吗?而不是运行时间?就像描述函数一样.

php php-internals

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

为什么PHP不使用内部智能字符串作为字符串?

PHP有一个称为智能字符串(smart_str?)的内部数据结构,它们存储长度和缓冲区大小.也就是说,分配比字符串长度更多的内存来提高串联性能.为什么这个数据结构不是用于实际的PHP字符串?这不会导致更少的内存分配和更好的性能吗?

string php-internals

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

为什么PHP允许在一种情况下将文字传递给pass-by-reference参数而不允许其他情况?

该函数array_shift()通过引用获取一个参数.传递数组文字会导致致命错误:

$ php -r'var_export(array_shift(array("Test#0"));'; echo

致命错误:在第1行的命令行代码中,只能通过引用传递变量

这按预期失败.但是,当使用call_user_func_array调用函数时,PHP表现得很奇怪:

<?php
var_export(call_user_func_array("array_shift", array(array("Test #1"))));
echo "\n";

$arg1 = array("Test #2");
var_export(call_user_func_array("array_shift", array($arg1)));
echo "\n";

$args = array(array("Test #3"));
var_export(call_user_func_array("array_shift", $args));
echo "\n";
Run Code Online (Sandbox Code Playgroud)

执行时:

$ php test.php

'测试#1'

警告:参数1到array_shift()应该是一个引用,在第6行的/Users/kcc/test.php中给出的值NULL

警告:参数1到array_shift()应该是一个引用,在第10行的/Users/kcc/test.php中给出的值NULL

可以理解的是call_user_func_array(),不会触发致命错误,但为什么第一种形式可以正常工作呢?

php pass-by-reference php-internals

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