我有一个相当高的流量社交网站,
我想养成取消设置大型数组和mysql对象甚至一些字符串变量的习惯.
那么有可能在PHP中取消设置多于1个项目
例:
<?PHP
unset($var1);
// could be like
unset($var1,$var2,$var3);
?>
Run Code Online (Sandbox Code Playgroud) 不确定为什么会发生这种情况:基本上,我有一个包含以下数组的数组,请参阅var_dump:
array(2) {
[0]=> array(1) {
[0]=> string(3) "ivr"
}
[1]=> array(1) {
[0]=> string(9) "ivr_dests"
}
}
Run Code Online (Sandbox Code Playgroud)
显然这些数据有点多余,但它是在使用xpath获取值时返回的内容.所以我正在做一个foreach循环遍历第一个array()并在第一个数组中分配它的嵌套数组值.
基本上,它应该返回:
array(2) {
[0]=> string(3) "ivr"
[1]=> string(9) "ivr_dests"
}
Run Code Online (Sandbox Code Playgroud)
所以这就是我设置的内容:
foreach($arr as $key => $arr2){
$arr2[$key] = $arr2[$key][0];
unset($arr2[$key][0]); //This returns Fatal error: Cannot unset string offsets
//if I comment out the unset(), $arr[$key] returns the same value as it did (multidim array)
};
//I tried this too:
$i=0;
foreach($arr as $arr2){
$arr2[$i] = …Run Code Online (Sandbox Code Playgroud) 我在MongoDB中有一个名为CrawlUser的集合.它有一个名为CrawlStatuses的列表,它是CrawlStatus对象的列表.CrawlStatus有一个名为LastErrorMessage的属性,我想从集合中删除它.
我尝试执行以下操作以删除它但它不起作用...没有给出错误消息,但LastErrorMessage列仍然存在.
db.CrawlUser.update( {}, { $unset: { "CrawlStatuses.LastErrorMessage": 1 } }, false, true);
Run Code Online (Sandbox Code Playgroud)
我有什么想法我做错了吗?
另一个相关的问题,如果我在一个非常大的集合(数百万行)的列上执行$ unset命令,mongodb会占用服务器上的所有ram(就像它试图将整个集合存储在内存中一样) ),然后服务器崩溃.有大量集合时是否有更好的方法可以删除列?
我有两个简单的问题.什么是更好/有用的内存清理.
$var = null;
Run Code Online (Sandbox Code Playgroud)
要么
unset($var);
Run Code Online (Sandbox Code Playgroud)
我有一个循环的功能.我得到了(几分钟后)
Fatal error: Allowed memory size of 419430400 bytes exhausted
Run Code Online (Sandbox Code Playgroud)
我设置null并取消设置() - 每个对象(在循环结束时)但仍然没有任何成功:(我无法找出消耗内存的东西.
那么循环中的函数调用呢?PHP会在这些函数中释放所有分配吗?(通话后)
我有这个数组$输出,看起来像这样:
Array(
[0] => Array(
[0] => 1a
[1] => 1b
[2] => 1c
)
[1] => Array(
[0] => 2a
[1] => 2b
[2] => 2c
)
[2] => Array(
[0] => 3a
[1] => 3b
[2] => 3c
)
[3] => Array(
[0] => 4a
[1] => 4b
[2] => 4c
)
)
Run Code Online (Sandbox Code Playgroud)
等等...
当我想删除我刚刚使用的第二个元素时
$output = unset($output[1]);
Run Code Online (Sandbox Code Playgroud)
获得以下内容:
Array(
[0] => Array(
[0] => 1a
[1] => 1b
[2] => 1c
)
[1] => Array(
[0] => …Run Code Online (Sandbox Code Playgroud) 试图自动取消设置脚本中的所有变量.
尝试过这种方式:
echo '<br /> Variables in Script before unset(): <br />';
print_r(array_keys(get_defined_vars()));
echo '<br /><br />';
var_dump(get_defined_vars());
// Creates string of comma-separated variables(*) for unset.
$all_vars = implode(', $', array_keys(get_defined_vars()));
echo '<br /><br />';
echo '<br />List Variables in Script: <br />';
echo $all_vars;
unset($all_vars);
echo '<br /><br />';
echo '<br />Variables in Script after unset(): <br />';
print_r(array_keys(get_defined_vars()));
echo '<br />';
var_dump(get_defined_vars());
Run Code Online (Sandbox Code Playgroud)
为什么不起作用?
有一个更好的方法吗?
谢谢你的帮助!
(*) It's seems somewhat that it does not really create the variables, but …
有没有办法使用一个命令取消设置不同的变量?
unset HTTP_PROXY
unset HTTPS_PROXY
unset FTP_PROXY
unset ALL_PROXY
unset NO_PROXY
Run Code Online (Sandbox Code Playgroud) 我刚刚通过php手册阅读了未设置的变量.
php手册说 "unset()破坏了指定的变量"
这个def看起来很完美,直到我遇到静态变量...... "如果一个静态变量在函数内部未设置(),unset()仅在函数的其余部分的上下文中销毁变量.以下调用将恢复之前的变量的值."
至少,这个定义对我来说似乎不是一个好的定义,因为"销毁变量"意味着变量不再与该内存位置相关联.
是否还有其他人认为更好的定义是"unset()使变量超出当前范围"?我的意思是,不是指向终生,而是在这里使用单词范围更好?
我可以通过引用方法访问多维数组中的任何位置.我可以改变它的价值.例如:
$conf = array(
'type' => 'mysql',
'conf' => array(
'name' => 'mydatabase',
'user' => 'root',
'pass' => '12345',
'host' => array(
'127.0.0.1',
'88.67.45.123',
'129.34.123.55'
),
'port' => '3306'
)
);
$value = & $this->getFromArray('type.conf.host');
$value = '-- changed ---';
// result
$conf = array(
'type' => 'mysql',
'conf' => array(
'name' => 'mydatabase',
'user' => 'root',
'pass' => '12345',
'host' => '-- changed ---'
'port' => '3306'
)
);
Run Code Online (Sandbox Code Playgroud)
但是,我不能破坏该部分:
// normally success
unset($conf['type']['conf']['host']);
// fail via reference …Run Code Online (Sandbox Code Playgroud) 我有一个关于PHP函数中使用的变量/数组的问题.执行该函数后,是否所有变量都自动取消设置?如果没有,在执行整个PHP页面后,它们何时完全取消设置?过了一段时间?
将函数末尾的函数中使用的所有变量取消设置以从内存中释放是否有用?
提前感谢您的帮助和意见!