1

トーナメントスコアリングWebサイトのJQueryAJAX呼び出しを介してロードされたデータの複数のテーブルを表示するPHPスクリプトがあります。表は、リアルタイムで計算された個人およびチームのスコアです。

各テーブルは1分ごとに新しいスコアがないかチェックされ、必要に応じて更新されます。これを行うために、各テーブルはスコアの最後に更新された時刻にクイックajaxリクエストを送信します...時刻が現在のテーブルと異なる場合、テーブルは新しいデータで更新されます。

私の問題は、これらのトーナメントが非常に大きくなる可能性があり、多くの参加者、チーム、部門、スコアがあり、各テーブルのロードにはサーバーリソースが使用されることです。少数の人がリアルタイムの統計を表示している場合、これは問題ありませんが、約50人以上がこの統計ページに接続すると、サーバーは大幅に遅れ始めます。

データ、ajax呼び出し、またはサーバー自体を最適化して、サーバーがすぐにいっぱいにならないように、できるだけ効率的に実行するために何ができるかを知りたいです。私はすでにMySQLの呼び出しをくまなく調べて、可能な限りすべてを最適化しようとしましたが、それだけでは十分ではないようです。

どんなアイデアでも大歓迎です!

4

2 に答える 2

1

キャッシュを使用できます。たとえば、アーキテクチャではmemcacheが非常に適しています。サーバーがリクエストを受信するたびに、phpアプリはキャッシュから結果を取得しようとします。見つからない場合は、クエリを実行します。

これで、2つの異なる方法を選択できます。

  • 簡単で、キャッシュの有効期限を待ちます。キャッシュの有効期限が切れると、サーバーは検索を見逃し、新しいクエリが送信されます。これは通常、短期間のキャッシュ(秒または分)です。
  • ハード、キャッシュは非常に遠い将来、たとえば数時間または数日で期限切れになります)。この場合、アプリケーションはデータベースが更新されるたびにキャッシュコンテンツを更新します。この場合、明らかに、ほとんどすべてのリクエストがキャッシュにヒットします(最高のパフォーマンス)。

この例は、簡単なアプローチに基づいており、キャッシュキーは送信されたSQLに直接基づいています。

global $memcache;
$memcache = new Memcache;

// Gets key / value pair into memcache ... called by mysql_query_cache()
function getCache($key) {
    global $memcache;
    return ($memcache) ? $memcache->get($key) : false;
}

// Puts key / value pair into memcache ... called by mysql_query_cache()
function setCache($key,$object,$timeout = 60) {
    global $memcache;
    return ($memcache) ? $memcache->set($key,$object,MEMCACHE_COMPRESSED,$timeout) : false;
}

// Caching version of mysql_query()
function mysql_query_cache($sql,$linkIdentifier = false,$timeout = 60) {
    if (($cache = getCache(md5("mysql_query" . $sql))) !== false) {
        $cache = false;
        $r = ($linkIdentifier !== false) ? mysql_query($sql,$linkIdentifier) : mysql_query($sql);
        if (is_resource($r) && (($rows = mysql_num_rows($r)) !== 0)) {
            for ($i=0;$i<$rows;$i++) {
                $fields = mysql_num_fields($r);
                $row = mysql_fetch_array($r);
                for ($j=0;$j<$fields;$j++) {
                    if ($i === 0) {
                        $columns[$j] = mysql_field_name($r,$j);
                    }
                    $cache[$i][$columns[$j]] = $row[$j];
                }
            }
            if (!setCache(md5("mysql_query" . $sql),$cache,$timeout)) {
                // If we get here, there isn't a memcache daemon running or responding
            }
        }
    }
    return $cache;
}

于 2012-12-02T23:30:52.057 に答える
1

1分または5分ごとに出力をキャッシュし、キャッシュを更新します...

つまり、データベース出力をファイルに書き込むだけで、その1分以内のすべてのリクエストがファイルを使用します...すべてのリクエストで、ファイルの経過時間を確認します。1分、2分、または5分(例)より古い場合は、キャッシュを削除します。ファイルして再構築します

これにより、その間mysqlを休ませることができます... Ajax呼び出しは、実行する必要があるものです...間隔が必要であると感じる限り

いくつかのサンプルPHP:

$cache_expires = 2; # Minutes
if (file_exists("stats.cache") && filemtime("stats.cache")>time()-$cache_expires*60) {
  # Read cache
  $result = unserialize(file_get_contents("stats.cache"));
  # Display result
} else {
  # Query the database
  $result = get_stats_from_database();
  # Write cache
  file_put_contents("stats.cache",serialize($result));
  # Display result
}
于 2012-12-02T23:15:56.810 に答える