php的include和ob函数在循环中导致的

allen0228 2011-03-29 02:56:07

程序大概如下
...
foreach($arr as $value){
ob_start();
include template($value['filename']);
$message = addslashes(trim(ob_get_contents()));
ob_end_clean();
}

这种模式执行5000条数据 就会出现

Too many open files的错误

如果执行数为1000没有问题

怎么解决啊
...全文
176 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
linuxmysqlphp 2011-06-12
  • 打赏
  • 举报
回复
师傅!弄出来没有!我也是
foreach($_POST['singlePage'] as $key=>$value){ //以POST方法中的数组做循环,输出键和值
$url2=$dirName.$value;
$fileName = $staticPage->getStaticPageName($dirName.$value, 'html' );
ob_start();
echo include($url2);
$content = ob_get_contents();
ob_end_clean();
$fp = fopen( '../../' . $fileName, 'w');
fwrite($fp, $content);
ob_end_flush();
echo "成功生成<font color='red'>".$value."</font>为<font color='red'>".$fileName."</font>";
echo "<br>";
}
jlzan1314 2011-04-28
  • 打赏
  • 举报
回复
include_once 不会行的 要看看你$value['file'] 模板文件多不多. 如果不多,完全可以缓存起来,用eval 执行.

这样虽然不太安全.. 还有你可以分批次搞啊.
helloyou0 2011-04-28
  • 打赏
  • 举报
回复
php 版本? 5.2.6?
可能是php的bug

试试把include改为include_once

http://bugs.php.net/bug.php?id=45133
xuzuning 2011-04-28
  • 打赏
  • 举报
回复
在 include template($value['filename']);
中 template 函数的作用是什么?仅仅就是返回一个真实的文件名吗?
如果是,那么静态的写法就是
include 'xxx.php';

是这样吗?如果是,就可以改成
eval('?>'. file_get_contents( template($value['filename'])) );
lazyboy_wu 2011-04-28
  • 打赏
  • 举报
回复
foreach($arr as $value){
ob_start();
include template($value['filename']);
$message = addslashes(trim(ob_get_contents()));
ob_end_clean();
}

话说你这样是生成静态吗?

用请求跳转来分批做啊

伪代码演示

触发请求:dosomeing.php?page=1&per=1000;

$arr = $data.limit((page-1)*$per, per)

foreach($arr as $value){
ob_start();
include template($value['filename']);
$message = addslashes(trim(ob_get_contents()));
ob_end_clean();
}
$page++;
header('Location: dosomeing.php?page='.$page.'&per='.$per)
allen0228 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xuzuning 的回复:]
Too many open files 是打开文件太多
你应考虑换个思路,而不是 include
[/Quote]
我也想换 没想到啊
木目子 2011-04-27
  • 打赏
  • 举报
回复
建议你查一下ob_start和ob_end_clean()、ob_get_contents()的用法,理解清楚了就知道怎么回事了

ob_start();
foreach($arr as $value){
include template($value['filename']);
$message = addslashes(trim(ob_get_contents()));
ob_end_clean();
};
xuzuning 2011-04-27
  • 打赏
  • 举报
回复
Too many open files 是打开文件太多
你应考虑换个思路,而不是 include
allen0228 2011-04-27
  • 打赏
  • 举报
回复
这样子的话ob_get_contents()不就叠加了
CunningBoy 2011-03-29
  • 打赏
  • 举报
回复
ob_start();
foreach($arr as $value){
include template($value['filename']);
$message = addslashes(trim(ob_get_contents()));
};
ob_end_clean();

21,882

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧