视频教程分类
推荐视频教程
  • Laraval 9 学习正当时—保姆级教程,想学不会都难!Laraval 9 学习正当时—保姆级教程,想学不会都难!
  • 千万级数据并发解决方案(理论+实战)千万级数据并发解决方案(理论+实战)
  • Laravel基础与实战(模块化)Laravel基础与实战(模块化)
  • UNI-APP开发(仿饿了么)UNI-APP开发(仿饿了么)
  • 首页 >后端开发 >php教程 > 正文

    循环大量数据导致内存超出,不增加内存如何解决该问题

    原创2021-05-25 14:41:03369100 关注公众号:每天精选资源文章推送
    我在生成HTML文件时,由于数据量较大,无数次的 fopen fwrite fclose,文件还没生成完呢,就提示内存超出。
    我的HTML生成方式是,读入缓存,再写入文件

    ob_start ();		
    $temp = ob_get_contents ();		
    ob_end_clean ();


    我unset(temp) 也不起作用,这个问题到底该怎么解决。不知那些CMS又是怎么生成HTML的,再大的数据也不会内存超出

    回复讨论(解决方案)

    不知道你的具体代码,不好说什么

    需要及时释放工作变量,可将工作放在函数中执行,以利用 php 自己的回收机制
    自己释放变量时需注意的是数组占用的内存是只增不减的,所以要注意数组的复用


    我在生成HTML文件时,由于数据量较大,无数次的 fopen fwrite fclose,文件还没生成完呢,就提示内存超出。
    我的HTML生成方式是,读入缓存,再写入文件

    ob_start ();		
    $temp = ob_get_contents ();		
    ob_end_clean ();


    我unset(temp) 也不起作用,这个问题到底该怎么解决。不知那些CMS又是怎么生成HTML的,再大的数据也不会内存超出


    比如某个脚本为必须为死循环,那么循环到一定次数就会造成内存超出,如何控制每循环100次,释放内存

    那你加个循环控制量就是了

    PHP生成HTML,怎样才能让他内存不超出,求代码

    周末休息没人回答了




    我在生成HTML文件时,由于数据量较大,无数次的 fopen fwrite fclose,文件还没生成完呢,就提示内存超出。
    我的HTML生成方式是,读入缓存,再写入文件

    ob_start();		
    $temp = ob_get_contents ();		
    ob_end_clean ();


    我unset(temp) 也不起作用,这个问题到底该怎么解决。不知那些CMS又是怎么生成HTML的,再大的数据也不会内存超出


    比如某个脚本为必须为死循环,那么循环到一定次数就会造成内存超出,如何控制每循环100次,释放内存


    $p = $_GET['p'] * 100;
    for($i=$p; $i<$p+100; $i++){	e
    cho $i;	echo '<br>';	
    // .....	
    // 执行其他操作
    }sleep(1);
    ?>
    <script>
    var p = GetQueryString('p');
    p++;var url = window.location.href;
    var new_url = url.replace(/\?p=(\d)+/, '') + '?p=' + p;
    window.location.href = new_url;
    function GetQueryString(name){     
    var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");     
    var r = window.location.search.substr(1).match(reg);     
    if(r!=null)return  unescape(r[2]); return null;}
    </script>

    思路就是把大任务分批执行

    用分页读取的方式。
    加:register_shutdown_function
    每页写完,自动header location到下一页。

    用register_shutdown_function 的话,只要你打开了第一次,就可以关闭浏览器了,它会自动执行。

    数据的最后一页写完了,要执行:die();

    这种情况要分批执行,上个代码,你马上就明白其中的原理了

    $total = 10;$s = 0;
    if (isset ( $_GET ['s'] )) {        
    $s = &$_GET ['s'];
    }$per = $s + 5; 
    // 每次循环5条if ($per > $total) {
     // 如果下次循环会超过总数,就让他只能循环到总数        
     $per = &$total;}while ( $s < $per ) {        
     echo ++ $s;        echo '<br>';
     }
     echo '<hr>';
     echo $s;if ($s < $total) {        
     echo "<script>window.location.href='?s=$s'</script>";
     }
    高并发千万级数据库系统解决方案

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    相关文章

    相关视频


    专题推荐