zblog调取大量数据内存不溢出的方法
时间:2023年05月24日
/来源:网络
/编辑:佚名
想必各位开发者都遇到过这个问题,一次性调用大量的数据就会内存溢出,常见的应该是sitemap插件,当网站有大量文章的时候,生成sitemap时就会出现下图错误。
Allowed memory size of 134217728 bytes exhausted (tried toallocate 74579968 bytes)
为了方便大家,本站封装好了一个函数,调用全部数据并不会出现内存溢出的情况
下面的例子是导出网站用户1的所有文章名,每次取出100个文章
点击复制代码 PHP
set_time_limit(0);
//封装好的函数
function GetAllData($method, $w, $o, $limit, $callback){
global $zbp;
$page = 1;
do{
$p = new Pagebar('', false);
$p->PageNow = $page++;
$p->PageCount = $limit;
$array = $zbp->$method(
'*',
$w,
$o,
array(($p->PageNow - 1) * $p->PageCount, $p->PageCount),
array('pagebar' => $p),
false
);
$complete = !$limit || $limit * $p->PageNow >= $p->Count;
$res = $callback($array, $p, $complete);
if ($res === false){
break;
}
$zbp->posts = []; //清空zb内存中的文章缓存,防止内存溢出
}while(!$complete);
}
//例:导出所有用户1的文章名
header("Content-Disposition:attachment;filename=posts.txt");
//调用本站封装好的函数
GetAllData('GetArticleList', array(array('=','log_AuthorID',1)), array('log_PostTime' => 'DESC'), 100, function($articles, $pagebar, $complete){
// $pagebar pagebar分页对象
if ($complete){
//已取出全部
}else{
//还有数据未取出
}
//执行你的代码
foreach ($articles as $article) {
echo iconv("UTF-8","GB2312//IGNORE", $article->Title."\n");
}
ob_flush();
flush();
//结束你自己的代码
//return false; //终止,即便还有数据未取出,也不会再去取,也不会执行回调函数。如果继续执行,请不要添加此代码
});
Allowed memory size of 134217728 bytes exhausted (tried toallocate 74579968 bytes)
为了方便大家,本站封装好了一个函数,调用全部数据并不会出现内存溢出的情况
下面的例子是导出网站用户1的所有文章名,每次取出100个文章
点击复制代码 PHP
set_time_limit(0);
//封装好的函数
function GetAllData($method, $w, $o, $limit, $callback){
global $zbp;
$page = 1;
do{
$p = new Pagebar('', false);
$p->PageNow = $page++;
$p->PageCount = $limit;
$array = $zbp->$method(
'*',
$w,
$o,
array(($p->PageNow - 1) * $p->PageCount, $p->PageCount),
array('pagebar' => $p),
false
);
$complete = !$limit || $limit * $p->PageNow >= $p->Count;
$res = $callback($array, $p, $complete);
if ($res === false){
break;
}
$zbp->posts = []; //清空zb内存中的文章缓存,防止内存溢出
}while(!$complete);
}
//例:导出所有用户1的文章名
header("Content-Disposition:attachment;filename=posts.txt");
//调用本站封装好的函数
GetAllData('GetArticleList', array(array('=','log_AuthorID',1)), array('log_PostTime' => 'DESC'), 100, function($articles, $pagebar, $complete){
// $pagebar pagebar分页对象
if ($complete){
//已取出全部
}else{
//还有数据未取出
}
//执行你的代码
foreach ($articles as $article) {
echo iconv("UTF-8","GB2312//IGNORE", $article->Title."\n");
}
ob_flush();
flush();
//结束你自己的代码
//return false; //终止,即便还有数据未取出,也不会再去取,也不会执行回调函数。如果继续执行,请不要添加此代码
});
新闻资讯 更多
热门文章
- 178Moban源码谈谈免费源码与收费源码的区别
- 2帝国CMS忘记后台登陆用户名、密码、认证码的解决方法
- 3帝国CMS(EmpireCMS) v7.5后台任意代码执行漏洞及具体修复方法
- 4帝国CMS和WordPress 哪个好?哪个适合建站?
- 5如何解决Discuz的密码错误次数过多请15分钟后登陆的问题
- 6帝国cms灵动标签取得内容和栏目链接地址
- 7emlog pro 注册码“开心”教程(如果有一天,emlog官方版 或者 emlog免费版 跑路了,那用户怎么办?)
- 8织梦CMS在nginx下设置伪静态方法(附nginx伪静态规则)
- 9帝国cms后台登录出现”您还未登录”怎么解决?
- 10帝国cms7.5忘记登录密码 和忘记登录认证码以及多次登录 失败被锁定解决办法