当对mongodb进行查询时,它的光标如何处理内存中的结果集?光标是否一次检索与查询匹配的所有文档?或者它一次检索1个文件?或者他们缓冲?还是有一个我不知道的不同解决方案?
如果它是缓冲解决方案,它们如何存储在服务器/客户端上?客户端在本地保留多少数据?
我正在开发一个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宏观中误解了论证的目的?
我有一个数组存储对单个匿名函数的多个引用:
$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.)
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
$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(数组)来遍历每个元素.如果实现列表,为什么我不能在运行时添加更多?
请不要告诉我,我可以使用基于数字的索引来帮助计算.
我遇到了一个错误,其中返回的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内部发生的事情:
use garcha\path\class;
Run Code Online (Sandbox Code Playgroud)
我不是在询问命名空间的用途,而是关于那个语句本身,即使它没有分配任何内存,我的意思是,当你甚至为某个类提供别名时:
use garcha\path\class as withNewName;
Run Code Online (Sandbox Code Playgroud)
它存放在哪里?或者它如何记住这些名字?它只在编译时发生吗?而不是运行时间?就像描述函数一样.
PHP有一个称为智能字符串(smart_str?)的内部数据结构,它们存储长度和缓冲区大小.也就是说,分配比字符串长度更多的内存来提高串联性能.为什么这个数据结构不是用于实际的PHP字符串?这不会导致更少的内存分配和更好的性能吗?
该函数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(),不会触发致命错误,但为什么第一种形式可以正常工作呢?