热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请教大家关于phpfor循环中的大数据量处理时自动exit的问题

{代码...}基本原理是将数据库数据按照nsrsbh和id排序读取出来,然后将数据按照分片数据分割指定数目的文件(用于前台ajax请求,模拟多线程操作,js发送请求后端接收后处理传过来的数据分片的文件name,然后...
        /**
         * @function getSplitCache 对excelId基础数据进行分片缓存
         * @param type $excelId  excel文件id tax_excel的id
         * @param type $beforeAndAfterInsertid  details_excel  插入前后的id
         * @return 无  统一excel的缓存文件标准为: EXCEL_ID_NUM 
         */
        public function getSplitCache($excelId, $beforeAndAfterInsertid){
            processTip( '100%', 'Excel数据分片开始.....................');
            $where['id']        = array('gt', $beforeAndAfterInsertid['beforeId']); 
            $where['excel_id']   = array('eq', $excelId);        //是否可能存在两个表同时插入情况,如果无可省略此项
            $allExcelData =  $this->modelDetailsExcel->where($where)->group('nsrsbh,id')->select();
            $totalNum   = count($allExcelData);
            $this->_setAllRow($totalNum);
//            $interval = ceil( ($beforeAndAfterInsertid[1]-$beforeAndAfterInsertid[0])/$this->excelDataCacheNum);//多个人同时出现操作插入文件是可能错误
            $interval = ceil($totalNum/$this->excelDataCacheNum);
            for($i = 0; $i<$this->excelDataCacheNum; $i++ ){
                $excelData[$i] = array_slice($allExcelData, $i*$interval, $interval);
            }
            unset($allExcelData);
            //1一个在开头一个在结尾利用时间差可以不再细分
            //2必须分在一起以下为分在一起的
            $i = 0;
            for($i;  $i<$this->excelDataCacheNum-1;  $i++ ){
                if($excelData[$i][$interval-1]['nsrsbh'] === $excelData[$i+1][0]['nsrsbh']){
                    $j = 0;

                    while( $excelData[$i][$interval-1]['nsrsbh'] === $excelData[$i+1][$j]['nsrsbh']){
                        $excelData[$i][] = $excelData[$i+1][$j++];
                        P($j);
                    }
                    array_splice($excelData[$i+1], 0, $j);
                }
                //输出前台展示进度
                processTip( ($i/$this->excelDataCacheNum*100), 'Excel数据分片'.$i.'.....................');
                //Thinkphp的F缓存方法 指定位置和名称
                F('Excel_'.$excelId.'/'.$i , $excelData[$i]); 
            }
            F('Excel_'.$excelId.'/'.   $i , $excelData[$i]);
            processTip( '100%', 'Excel数据分片结束.....................');
            return  $this->excelDataCacheNum;
        }

基本原理是 将数据库数据按照nsrsbh 和 id排序 读取出来,然后将数据按照分片数据 分割指定数目的文件(用于前台ajax请求,模拟多线程操作,js发送请求后端接收后处理传过来的数据分片的文件name,然后处理改文件内的数据)
系统环境 apche php 分配的memoryliimit win(win10 64bit 4G内存)为2g linux(ubuntu14.04 64位 8g内存)为4g
经过测试当数据量在3500条时分片1000正常执行。
当数据量在11770条时,linux下和win下开始出现这个问题
到978片缓存生成时就进行不下去,php程序自动跳出 效果如下 然后进程就退出了。

当分片为500的时候出现到488 就会卡 然后到了过个2分钟左右才会输出489 然后没有然后了 进程跳出了

回复内容:

        /**
         * @function getSplitCache 对excelId基础数据进行分片缓存
         * @param type $excelId  excel文件id tax_excel的id
         * @param type $beforeAndAfterInsertid  details_excel  插入前后的id
         * @return 无  统一excel的缓存文件标准为: EXCEL_ID_NUM 
         */
        public function getSplitCache($excelId, $beforeAndAfterInsertid){
            processTip( '100%', 'Excel数据分片开始.....................');
            $where['id']        = array('gt', $beforeAndAfterInsertid['beforeId']); 
            $where['excel_id']   = array('eq', $excelId);        //是否可能存在两个表同时插入情况,如果无可省略此项
            $allExcelData =  $this->modelDetailsExcel->where($where)->group('nsrsbh,id')->select();
            $totalNum   = count($allExcelData);
            $this->_setAllRow($totalNum);
//            $interval = ceil( ($beforeAndAfterInsertid[1]-$beforeAndAfterInsertid[0])/$this->excelDataCacheNum);//多个人同时出现操作插入文件是可能错误
            $interval = ceil($totalNum/$this->excelDataCacheNum);
            for($i = 0; $i<$this->excelDataCacheNum; $i++ ){
                $excelData[$i] = array_slice($allExcelData, $i*$interval, $interval);
            }
            unset($allExcelData);
            //1一个在开头一个在结尾利用时间差可以不再细分
            //2必须分在一起以下为分在一起的
            $i = 0;
            for($i;  $i<$this->excelDataCacheNum-1;  $i++ ){
                if($excelData[$i][$interval-1]['nsrsbh'] === $excelData[$i+1][0]['nsrsbh']){
                    $j = 0;

                    while( $excelData[$i][$interval-1]['nsrsbh'] === $excelData[$i+1][$j]['nsrsbh']){
                        $excelData[$i][] = $excelData[$i+1][$j++];
                        P($j);
                    }
                    array_splice($excelData[$i+1], 0, $j);
                }
                //输出前台展示进度
                processTip( ($i/$this->excelDataCacheNum*100), 'Excel数据分片'.$i.'.....................');
                //Thinkphp的F缓存方法 指定位置和名称
                F('Excel_'.$excelId.'/'.$i , $excelData[$i]); 
            }
            F('Excel_'.$excelId.'/'.   $i , $excelData[$i]);
            processTip( '100%', 'Excel数据分片结束.....................');
            return  $this->excelDataCacheNum;
        }

基本原理是 将数据库数据按照nsrsbh 和 id排序 读取出来,然后将数据按照分片数据 分割指定数目的文件(用于前台ajax请求,模拟多线程操作,js发送请求后端接收后处理传过来的数据分片的文件name,然后处理改文件内的数据)
系统环境 apche php 分配的memoryliimit win(win10 64bit 4G内存)为2g linux(ubuntu14.04 64位 8g内存)为4g
经过测试当数据量在3500条时分片1000正常执行。
当数据量在11770条时,linux下和win下开始出现这个问题
到978片缓存生成时就进行不下去,php程序自动跳出 效果如下 然后进程就退出了。

当分片为500的时候出现到488 就会卡 然后到了过个2分钟左右才会输出489 然后没有然后了 进程跳出了

你去php.ini文件中看看有没有配置最大变量长度的那个设置项,找到它,修改后服务器重启即可。


我以前恰好遇到过这个问题

  • 打开 error_reporting
    可在脚本最上方添加

    phperror_reporing(E_ALL);
    ini_set('display_errors');
    

    监控数据量多的情况下,是不是内存使用超出限制

  • 如果确认是内存溢出
    改造你的程序,降低内存使用
    比如使用generator
    具体根据你的业务,尽量不要取太多数据放入内存
    保证你程序运行的时候不要随着处理数据量的增大而内存也跟着增大
    理想的情况是处理数据量的增长不会导致程序运行内存的暴增

set_time_limit(0),设置超时时间,不是内存的问题可能是超时了

推荐阅读
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • STM32与FPGA的对比及学习建议
    本文对比了野火STM32F103指南针板和Xilinx的PYNQ-Z2板(ZYNQ-7020),介绍了野火STM32F103指南针板的学习资料和讲解视频的详细程度,建议初学者学习野火的资料。同时,介绍了STM32开发所用的Keil程序和C指针的重要性。对于ZYNQ-7020的开发,提到了其自带的Linux、Ubuntu18.4系统以及使用SD卡烧入镜像的方法。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 本文介绍了在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一,尤其是在大规模系统中,数据库集群已经成为必备的配置之一。文章详细介绍了主从数据库架构的好处和实验环境的搭建方法,包括主数据库的配置文件修改和设置需要同步的数据库等内容。MySQL的主从复制功能在国内外大型网站架构体系中被广泛采用,本文总结了作者在实际的Web项目中的实践经验。 ... [详细]
  • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 在ubuntu服务器上安装vscode,但是目前使用的方法都无法成功。第一次安装经历:安装完anaconda后有自动安装vscode的选项,输入yes后,没有出现错误,但是在终端输 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
author-avatar
Martha829
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有