小兔网

我在生成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++){echo $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="https://zhishitu.com/ke" 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="https://zhishitu.com/ke" }