0

我不习惯处理这么大的物体(呵呵)。我有一个查询,它通过 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+ 个站点)

4

1 回答 1

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 并不是处理它的最快方法。

于 2013-05-03T03:36:04.997 回答