我不习惯处理这么大的对象(hehe)。我有一个查询,通过我所有的子域从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
表中不可用的名称搜索网站。URL是,但是URL可能是"smsalem",但用户可能会搜索类似"Service Master"或甚至只是"Service"之类的内容。
我将内存限制提高到256mb(太高了吗?)或者我可以设置更高的值吗?)因为我得到了内存耗尽错误。
现在它完成得很好,我回显内存使用情况并得到201043248, 201mb。我的初始$blogs
数组中有大约1,400个项目。
这个"工作",但我担心每次有人使用这个页面(我们有一个专用服务器),201mb是非常高的,我想知道是否有一种方法来优化这一点,或者如果这些数字足够低,不用担心(我们可能在未来一两年内看到5k+网站)
尝试在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:是的,对于任何文本搜索,你最好尝试Sphinx/Solr/ElasticSearch/等,因为MySQL不是最快的处理它的东西。