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 は smsalem かもしれませんが、ユーザーは「サービス マスター」または単に「サービス」などを検索します。

メモリ不足のエラーが発生したため、メモリ制限を 256 MB に上げました (これは高すぎますか? それとも、それ以上にできますか?)。

これで問題なく完了し、メモリ使用量をエコーし​​て201043248、201mb を得ました。私の最初の$blogs配列には、約 1,400 個の項目があります。

これは「機能します」が、誰かがそのページを使用するたびに 201mb が非常に高くなるのではないかと心配しています (専用サーバーがあります)。約 (今後 1 年か 2 年で 5,000 以上のサイトを検討している可能性があります)

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 検索でも、MySQL はそれを処理する最速のものではないため、Sphinx/Solr/ElasticSearch/etc を試してみてください。

于 2013-05-03T03:36:04.997 に答える