我不习惯使用这些大对象(呵呵)。我有一个查询从mysql查询运行我的所有子域:
$blogs = $wpdb->get_results(
"SELECT blog_id,path FROM {$wpdb->blogs}
WHERE blog_id != {$wpdb->blogid}
AND site_id = '{$wpdb->siteid}'
AND spam = '0'
AND deleted = '0'
AND archived = '0'
order by blog_id", ARRAY_A
);
然后我运行foreach来获取一些数据(特别是博客名称)
foreach( $blogs as $blog ) :
switch_to_blog( $blog[ 'blog_id' ] );
if(strpos(strtolower($blog_details->blogname), strtolower($_GET['squery'])) !== false){
//Show the site's title and link to the site
}
endforeach;
我这样做是因为我需要用户能够通过它在$wpdb->blogs
表中找不到的NAME来搜索网站。 URL是,但网址可能是smsalem“但用户会搜索类似”服务大师“的内容,甚至只是”服务“。
我将内存限制提高到256mb(太高了?或者我可以更高?)因为我的内存耗尽错误。
现在它完成得很好,我回应了内存使用情况并获得了 201043248 ,201mb。我的初始$blogs
数组中有大约1,400个项目。
这“有效”,但我担心只要有人使用该页面(我们有一个专用服务器),201mb就会非常高,我想知道是否有办法优化这一点或者这些数字是否足够低不用担心(我们可能会在未来一两年内关注5k +网站)
答案 0 :(得分:0)
尝试在SQL语句中使用LIMIT,这样您就可以通过较小的块来获取数据。
类似的东西:
$result = $wpdb->get_row("SELECT COUNT(id) AS rowCount FROM {$wpdb->blogs}");
$rowCount = $result->rowCount;
for($offset=0; $offset<$rowCount; $offset+=50)
{
$blogs = $wpdb->get_results(
"SELECT blog_id,path FROM {$wpdb->blogs}
WHERE blog_id != {$wpdb->blogid}
AND site_id = '{$wpdb->siteid}'
AND spam = '0'
AND deleted = '0'
AND archived = '0'
ORDER BY blog_id
LIMIT {$offset},50", ARRAY_A);
foreach( $blogs as $blog ) :
switch_to_blog( $blog[ 'blog_id' ] );
if(strpos(strtolower($blog_details->blogname),
strtolower($_GET['squery'])) !== false){
//Show the site's title and link to the site
}
endforeach;
}
通过这样做,你肯定会增加sql查询的数量,但无论如何,整体内存使用量将显着降低。 50岁是不到1400,是的。
PS:是的,对于任何TEXT搜索,你最好尝试Sphinx / Solr / ElasticSearch / etc,因为MySQL不是最快的处理它。