嵌套的php循环吞噬了GB的Linux薄荷内存 [英] nested php loop eats gigabytes of linux mint memory
本文介绍了嵌套的php循环吞噬了GB的Linux薄荷内存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
I have some 7 nestings for/foreach php script which crashed my computer many times, and eaten each time 200-500 Mb memory, more than 3GB in total.
I can not recover the memory.
我在代码中使用 opcache_reset();
也在命令行中尝试过
apt clean
apt autoremove --purge
apt-get autoremove
apt-get autoclean
apt-get clean
php哪里出问题了?
Where is the problem with php?
opcache_reset();
$wayA = [
'way1' => [
'pr_w1' => [1, 6, 25, 50 ],
'revenue_w1' => 0,
'profit_w1' => 0,
'opex_w1' => [],
't_r_w1' => 0,
],
'way2' => [
'price_w2'=> [ 5, 10, 25, 50, 90 ],
'revenue_w2'=>0,
'profit_w2'=>0,
'opex_w2'=>0,
't_r_w2'=>0,
],
];
for ( $w=1; $w<2; $w++ ) {
for ( $e=1; $e<=21; $e+4 ) {
$ansA[$e][$w]=[];
$tw = $tz + $e * 100;
$tz = $tw;
for ( $t_rr=1; $t_rr<2; $t_rr++ ) {
$t_r=5 + $t_rr*20; //tourists
for ( $pr_rr=1; $pr_rr<2; $pr_rr++ ) {
$pr_r= 5+ $pr_rr*15; //price
for ( $opex_rr=1; $opex_rr<2; $opex_rr++ ) {
$opex_r= 9 + $opex_rr*20; //opex
for( $N=1; $N<=2; $N++ ) {
$pr_wX_key ='pr_w'.$N; //'price_w1' = 'pr_w1'
$wayX_key='way'.$N;
foreach ( $wayA[$wayX_key][$pr_wX_key] as $pr ) {
$pr_wX = $pr / $pr_r;
$opex_wX = $pr_wX * $opex_r/100;
$t_NX = $tz * $t_r/100;
$rev_wX = $t_NX * $pr_wX;//revenue = tourist numer * price
$prof_bt_wX = $pr_wX - $opex_wX; //profit
$pr_wX_kX = 'pr_w'.$N;
$opex_wX_kX = 'opex_w'.$N;
$t_r_wX_kX = 't_r_w'.$N;
$rev_wX_kX = 'rev_w'.$N;
$prof_bt_wX_kX = 'prof_bt_w'.$N;
$ansA[$w][$e][$t_NX_k]=[];
$pr_wX_k= sprintf('%g',$pr_wX);
$opex_wX_k= sprintf('%g',$opex_wX);
$ansA[$w][$e][$t_NX_k][$pr_wX_k]=[];
$ansA[$w][$e][$t_NX_k][$pr_wX_k][$opex_wX_k]=[];
$ansA[$w][$e][$t_NX_k][$pr_wX_k][$opex_wX_k][$pr_wX_kX] = $pr_wX; //'pr_w1'
$ansA[$w][$e][$t_NX_k][$pr_wX_k][$opex_wX_k][$opex_wX_kX] = $opex_wX; //'opex_w1'
$ansA[$w][$e][$t_NX_k][$pr_wX_k][$opex_wX_k][$t_r_wX_kX] = $t_NX; // 't_r_w1'
$ansA[$w][$e][$t_NX_k][$pr_wX_k][$opex_wX_k][$rev_wX_kX] = $rev_wX; // 'rev_w1'
$ansA[$w][$e][$t_NX_k][$pr_wX_k][$opex_wX_k][$prof_bt_wX_kX] = $prof_bt_wX; //'prof_bt_w1'
} // for ( way1['price_w1' as
} // for( $N=0; $N<4; $N++ )
} // for ( t_r_w1=5; t_r_w1<100; t_r_w
} // for ( opex_w1_r=9; opex_w
} // for ( price_w1=1; price_w
} // for ( $w=1; $w<250; $w++
} // for ( $e=1; $e<10
我已经将3GB的/home文件剪切/粘贴到其他磁盘上,但是每次我运行scrip时,我都会在/home中获得0字节的可用内存.为什么?
I have cut/pasted some 3GB of /home files to other disk, but each time i run scrip i finish with 0 bytes of free memory in /home. Why ?
推荐答案
您不能在 for
循环中执行 $ e + 4
-变量永远不会递增,并且会不断地奔跑.
You cannot do $e+4
in your for
loop -- the variable never increments and will run endlessly.
取而代之的是 $ e + = 4
.
此外,您可能需要考虑重构代码,以使代码更具可读性,更重要的是,可以维护.您可能不记得从现在开始的6个月后会执行什么操作.
Also, you may want to consider refactoring your code so it is more readable and, more importantly, maintainable. You probably won't remember what this does 6 months from now.
这篇关于嵌套的php循环吞噬了GB的Linux薄荷内存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文