数据太大&运行时间长导致500Internal Server Error错误怎么解决?

clipboard.png

checkAttendance()里面有个for循环,userList大概有一百多个用户,这样一循环,结果就是最后那个res_arrays肯定是很大的,时间也比较长,有办法解决这个问题吗?
程序应该没问题,我在where后面加上限制条件,比如只有几个用户的时候就可以算出来的。

代码是这样的,打了一些码,希望不影响。。
http://pic.027cgb.cn/20170303...

阅读 11.4k
9 个回答

换到服务器上跑没问题了....谢谢各位大大回答~

在PHP文件开头添加:

set_time_limit(0);

这样即便超时,服务器也会允许程序继续执行

谢邀!

对于数据量大的首先如果有field最好限制field,而且可以分批处理,每次取5000(固定数量):

    $userCount  = D('model')->count();
    for($i = 0; $i < ceil($userCount/5000); $i++) {
        $begin    = $i * 5000;
        $end      = ($i + 1) * 5000;
        $userList = D('model')->field('key_name')->limit($begin, $end)->select();
        foreach ($userList as $value) {
            ...
        }
    }
    

最后大批量的数据最好文件开头加上:

    set_time_limit(0);      //执行时间无限
    ini_set('memory_limit', '-1');    //内存无限

实现什么功能?

按道理几百个用户循环没什么问题的,看一下你的checkAttendance()方法里面,拖慢了运行速度

可以 sleep 几秒 然后 for循环的话 不如换成foreach 适量的做做优化 能加缓存就缓存 S 方法还是不错的

看了一下,你的checkAttendance()方法里面还有查询SQL,首先检查一下SQL执行速度,另外可以在循环的外层一次性查出数据后在来php做过滤筛选,数据量大的情况下做分次查询。

我觉得这个情况下,即使Php脚本一直在运行,但是你的web服务器应该会超时的,我觉得这样的操作不太好,应该改成异步的。下发这个任务,然后页面用ajax定时拉取一下执行结果,回显到页面给用户看比较好。

新手上路,请多包涵

楼主最后成功了,还是说本地就没有办法呢。。我也是这样执行一般的数据就没问题,数据一大就请求不过来了。。。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题