汗,百度一下啥都有了Fatal error: Maximum function nesting level of '100' reached, aborting!原因分析:这个问题是由于你启用了xdebug,而xdebug默认设置了函数最大嵌套数为100 解决办法:找到php.ini文件,找到xdebug 在最后加上xdebug.max_nesting_level = 500 (这个数最好大于100即可)
但是,如果我传递的数据大的话,他会报 Fatal error: Maximum function nesting level of '100' reached, aborting! 这个错误
按照上面的修改php.ini之后需要重启apache
按照上面的修改php.ini之后需要重启apache 会报错 Fatal error: Maximum function nesting level of '100' reached, aborting!
修改以后,报出 Maximum function nesting level of '500' reached, aborting!
按照上面的修改php.ini之后需要重启apache 修改以后,报出 Maximum function nesting level of '500' reached, aborting!
我详细给你说一遍 $starttime=strtotime($_POST['starttime']); $endtime =strtotime($_POST['endtime']); $user=D('user'); if(!empty($_POST['startnum']) && !empty($_POST['endnum'])){ $user->query("SET NAMES utf8"); $data=$user->query("SELECT * FROM `m_user` WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `m_user`))) ORDER BY id LIMIT ".$_POST['peoplenum']."; ",'select');//随机抽取 for($h=0;$h<=$_POST['peoplenum'];$h++){
} function rechangeadd($start,$end){ $starttime=strtotime($_POST['starttime']); $endtime =strtotime($_POST['endtime']); $user=D('user'); if(!empty($_POST['startnum']) && !empty($_POST['endnum'])){ $user->query("SET NAMES utf8"); $data=$user->query("SELECT * FROM `m_user` WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `m_user`))) ORDER BY id LIMIT ".$_POST['peoplenum']."; ",'select');//随机抽取 for($h=0;$h<=$_POST['peoplenum'];$h++){
功能就是一个模拟用户充值的东西,数据量很大,一次需要生成很大数据量,而这个随机数的变化是不能控制的,所以要考虑到大数据量的时候会报出 Fatal error: Maximum function nesting level of '100' reached, aborting!的错误,我查阅资料,看到,可以用 call_user_func_array()来消除递归,所以就想要把这个优化一下,但是call_user_func_array()在类中,还是返回null
解决办法:找到php.ini文件,找到xdebug
在最后加上xdebug.max_nesting_level = 500 (这个数最好大于100即可)
Fatal error: Maximum function nesting level of '100' reached, aborting! 这个错误
会报错
Fatal error: Maximum function nesting level of '100' reached, aborting!
Maximum function nesting level of '500' reached, aborting!
修改以后,报出
Maximum function nesting level of '500' reached, aborting!
贴出你的 rechangeadd 方法看看
你打算做什么?说说你的意图
我的moneyrand()是取随机几个数,随机数与10,50,100相乘,求和,满足一定范围后,返回:
总 和 跟10,50,100的随机数
如果不满足范围从新随机,直到满足要求
我的moneyrand()是取随机几个数,随机数与10,50,100相乘,求和,满足一定范围后,返回:
总 和 跟10,50,100的随机数
如果不满足范围从新随机,直到满足要求
传了最小范围,最大范围,需要获去[peoplenum]几次随机总和
for($h=0;$h<=$_POST['peoplenum'];$h++){
$total[$h]=$this->moneyrand($_POST['endnum']);
......
if($total[$h]['total']>$_POST['startnum'] && $total[$h]['total']<$_POST['endnum']){
......
}else{
//这里不加判断的重入,目的何在?
$total[$h]=call_user_func_array(array('Index','rechangeadd'),array($_POST['startnum'],$_POST['endnum']));
......
}
如果我用call_user_func_array(),需要再重新写一个方法?来return 值么?
或者,我给闭掉,直接调用自己?
call_user_func_array 将返回 rechangeadd 的返回值
而你的 rechangeadd 并没有返回值,很自然 $total[$h] 就是 null 了让你描述一下整体思路,你又不愿意
$starttime=strtotime($_POST['starttime']);
$endtime =strtotime($_POST['endtime']);
$user=D('user');
if(!empty($_POST['startnum']) && !empty($_POST['endnum'])){
$user->query("SET NAMES utf8");
$data=$user->query("SELECT * FROM `m_user` WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `m_user`)))
ORDER BY id LIMIT ".$_POST['peoplenum']."; ",'select');//随机抽取
for($h=0;$h<=$_POST['peoplenum'];$h++){
$total[$h]=$this->moneyrand($_POST['endnum']);
if($total[$h]['total']>$_POST['startnum'] && $total[$h]['total']<$_POST['endnum']){
$total[$h]['total']=$total[$h]['total'];
}else{
//$total[$h]=call_user_func_array(array('Index','rechangeadd'),array($_POST['startnum'],$_POST['endnum'])); $total[$h]=$this->rechangeadd($_POST['startnum'],$_POST['endnum']);
}
}
$rech=D('rechange');
for($i=0;$i<=$_POST['peoplenum']-1;$i++){
// $rechange[$i]['ip']=$ip; 可用记录
//插入充值10元的记录
for($j=0;$j<$total[$i]['rand_10'];$j++){
$ip_rand=mt_rand(0,2);//ip随机数
$ip_arr=explode(',',$data[$i]['ip']);
$rechange[$i]['ip']=$ip_arr[$ip_rand];
$rechange[$i]['username']=$data[$i]['username'];
$rechange[$i]['paystyle']='1';
$rechange[$i]['paytime']=rand($starttime,$endtime);;
$rechange[$i]['paynum']='10';
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$rand_order = "";
for ( $m = 0; $m < 5; $m++ )
{
// 这里提供两种字符获取方式
// 第一种是使用 substr 截取$chars中的任意一位字符;
// 第二种是取字符数组 $chars 的任意元素
// $password .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
$rand_order .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
$rechange[$i]['ordernum']='xnc'.date("YmdHms",$rechange[$i]['paytime']).$rand_order;
$result=$rech->insert($rechange[$i],1,1);
}
//插入充值50元记录
for($k=0;$k<$total[$k]['rand_50'];$k++){
$ip_rand=mt_rand(0,2);//ip随机数
$ip_arr=explode(',',$data[$i]['ip']);
$rechange[$i]['ip']=$ip_arr[$ip_rand];
$rechange[$i]['username']=$data[$i]['username'];
$rechange[$i]['paystyle']='1';
$rechange[$i]['paytime']=rand($starttime,$endtime);;
$rechange[$i]['paynum']='50';
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$rand_order ="";
for ( $n = 0; $n < 5; $n++ )
{
// 这里提供两种字符获取方式
// 第一种是使用 substr 截取$chars中的任意一位字符;
// 第二种是取字符数组 $chars 的任意元素
// $password .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
$rand_order .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
$rechange[$i]['ordernum']='xnc'.date("YmdHms",$rechange[$i]['paytime']).$rand_order;
$result=$rech->insert($rechange[$i],1,1);
}
//插入充值100元记录
for($x=0;$x<$total[$x]['rand_100'];$x++){
$ip_rand=mt_rand(0,2);//ip随机数
$ip_arr=explode(',',$data[$i]['ip']);
$rechange[$i]['ip']=$ip_arr[$ip_rand];
$rechange[$i]['username']=$data[$i]['username'];
$rechange[$i]['paystyle']='1';
$rechange[$i]['paytime']=rand($starttime,$endtime);;
$rechange[$i]['paynum']='100';
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$rand_order = "";
for ( $q = 0; $q < 5; $q++ )
{
// 这里提供两种字符获取方式
// 第一种是使用 substr 截取$chars中的任意一位字符;
// 第二种是取字符数组 $chars 的任意元素
// $password .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
$rand_order .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
$rechange[$i]['ordernum']='xnc'.date("YmdHms",$rechange[$i]['paytime']).$rand_order;
$result=$rech->insert($rechange[$i],1,1);
}
}
}
echo "<center><h1 style='color:green;'>ok</h1></center>";
}
function moneyrand($endnum){
$money=array('10','50','100');
$money_rand=mt_rand(0,2);
$total['max_10']=$max_10=$endnum/10;
$total['max_10']=$max_10=$endnum/10;
$total['max_50']=$max_50=$endnum/50;
$total['max_100']=$max_100=$endnum/100;
$rand_10=mt_rand(0,50);
$rand_50=mt_rand(0,$max_50);
$rand_100=mt_rand(0,$max_100);
//随机10元充值
$total['rand_10']=$rand_10;
$total['rand_50']=$rand_50;
$total['rand_100']=$rand_100;
$total['total']=$money[0]*$rand_10+$money[1]*$rand_50+$money[2]*$rand_100;
return $total;
}
这个是功能的全部
我想要的是:
1)form会传递3个值:开始金额,结束金额,生成数量,也就是moneyadd()方法
这三个随机的数据的范围(0.结束金额/10),(0.结束金额/50),(0.结束金额/100)
2)随机三个数,分别与10,50,100相乘后,得到一个和 ,返回总和 跟 随机出来的三个随机数
3)返回的和如果在 传递的金额范围内,就调用这三个随机数,进行数据插入,如果不在金额范围内容,重新再调用(也就是递归)rechangeadd()这个方法
4) 因为call_user_func_array()方法,我没有用过,具体怎么弄,不知道,所以现在屏蔽掉了
这个流程,您能看明白么?
function rechangeadd(){
这个没粘贴上去
重新调用是从头来过吗?原来符合的也从新算?在不在范围里 的判断要在 moneyadd 中进行,使得 moneyadd 总是返回合适的数据
function callbacktotal($callback,$params){
// P($callback);
// p($params);
$result=call_user_func_array($callback,$params);
while(is_callable($reuslt)){
return $result;
}
}
function rechangeadd($start,$end){
$starttime=strtotime($_POST['starttime']);
$endtime =strtotime($_POST['endtime']);
$user=D('user');
if(!empty($_POST['startnum']) && !empty($_POST['endnum'])){
$user->query("SET NAMES utf8");
$data=$user->query("SELECT * FROM `m_user` WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `m_user`)))
ORDER BY id LIMIT ".$_POST['peoplenum']."; ",'select');//随机抽取
for($h=0;$h<=$_POST['peoplenum'];$h++){
$total[$h]=$this->callbacktotal(array('Index','moneyrand'),array($_POST['endnum'],$_POST['startnum']));
}
}
function moneyrand($endnum,$startnum){
P($endnum);
p($startnum);
$money=array('10','50','100');
$money_rand=mt_rand(0,2);
$total['max_10']=$max_10=$endnum/10;
$total['max_10']=$max_10=$endnum/10;
$total['max_50']=$max_50=$endnum/50;
$total['max_100']=$max_100=$endnum/100;
$rand_10=mt_rand(0,50);
$rand_50=mt_rand(0,$max_50);
$rand_100=mt_rand(0,$max_100);
//随机10元充值
$total['rand_10']=$rand_10;
$total['rand_50']=$rand_50;
$total['rand_100']=$rand_100;
$total['total']=$money[0]*$rand_10+$money[1]*$rand_50+$money[2]*$rand_100;
if($total['total']>$startnum && $total['total']<$endnum){
return $total;
}else{
return $this->moneyrand($startnum,$endnum);
}
}
这是我重新修改以后的,您给看下,返回的还是null,哪个地方不正确啊
for($h=0;$h<=$_POST['peoplenum'];$h++){ $total[$h]=$this->callbacktotal(array('Index','moneyrand'),array($_POST['endnum'],$_POST['startnum']));
}
rechangeadd 方法至少需要有
return $total;
不然你算了半天不是白算了吗?
for($h=0;$h<=$_POST['peoplenum'];$h++){
$total[$h]=$this->callbacktotal(array('Index','moneyrand'),array($_POST['endnum'],$_POST['startnum']));
}
我写了一个callbacktotal()专门来调用call_user_func_array();
function callbacktotal($callback,$params){
//P($callback);
//p($params);
$result=call_user_func_array($callback,$params);
while(is_callable($reuslt)){
return $result;
}
}
function moneyrand($endnum,$startnum){
// P($endnum);
// p($startnum);
$money=array('10','50','100');
$money_rand=mt_rand(0,2);
$total['max_10']=$max_10=$endnum/10;
$total['max_10']=$max_10=$endnum/10;
$total['max_50']=$max_50=$endnum/50;
$total['max_100']=$max_100=$endnum/100;
$rand_10=mt_rand(0,50);
$rand_50=mt_rand(0,$max_50);
$rand_100=mt_rand(0,$max_100);
//随机10元充值
$total['rand_10']=$rand_10;
$total['rand_50']=$rand_50;
$total['rand_100']=$rand_100;
$total['total']=$money[0]*$rand_10+$money[1]*$rand_50+$money[2]*$rand_100;
if($total['total']>$startnum && $total['total']<$endnum){
return $total;
}else{
return $this->moneyrand($startnum,$endnum);
}
}
我这样写有错么?为什么返回的还null呢?
我现在的目标就是把moneyrand()返回值在callbacktotal()调取返回 用call_user_func_array()函数吧递归优化了,就这么简单
Fatal error: Maximum function nesting level of '100' reached, aborting!的错误,我查阅资料,看到,可以用
call_user_func_array()来消除递归,所以就想要把这个优化一下,但是call_user_func_array()在类中,还是返回null
因为你的程序是有问题的,我不可能从错误的程序中抽象出你的算法call_user_func_array 不能消除递归,只是用于动态调用函数