2012-04-26 13 views
4

私はWebサイトを開発しており、人々がデータ(投票)を挿入できるデータベースを持っています。私はヘッダーに "x"票が投げられたようなカウンターを保持したい。しかし、すぐに多くのトラフィックがウェブサイトに存在する可能性があります。今私は、クエリ30秒ごとにSQLクエリ(カウント)を実行し、出力をファイルに保存します。

SELECT COUNT(*) FROM `tblvotes 

やヘッダの表示数が、その後、毎回ユーザの変更ページでそれを行うことができ、それは、クエリを再実行しますので、私は思っています、多分それはクエリに優れています30秒に1回(これはmysqlサーバの負荷が非常に少ない)ですが、その出力をいくつかの場所に保存する必要があります(これはとても難しいことではなく、テキストファイルに書き込むことができます)。私のウェブサイトは自動的に30秒ごとにクエリを実行し、その番号をファイルに入れます。私はサーバーにSSHを持っていないので、私はそれをcrontabすることができますか?

ご不明な点がございましたらお気軽にお問い合わせください!

答えて

3

Crontabは毎分、最速で実行できます。

私はそこに良い解決策があると思います。統計情報が格納された集計テーブルを作成する必要があります。

votes_tableにtriggerがあると、テーブルがINSERT文を受け取るたびに「何か」できます。

次に、集計テーブルに最も正確な情報が格納されます。この情報を照会してカウントを表示できます。

+0

しかし、ページを切り替えるたびにユーザーがSQLクエリーを実行する必要がありますか?(クエリーはもうカウントされませんが、「select count from tbltriggercount」など) – Maximc

+0

@ Maximc - はい、あなたは依然としてそのクエリを実行する必要があります。さらに、ここでは大きな問題があります。つまり、集計テーブルが不正確な結果を報告するか、単にテーブル自体を更新するとパフォーマンスのボトルネックになります(これらの動作はトランザクション関連の問題に起因します)。あなたが本当に欲しいのは、とにかく何らかのメモリ内の解決策であり、集計表(単純な 'COUNT()'は簡単なものではありません)です。 –

+0

はい、実際には毎回クエリを実行する必要があります。しかし、count()やsum()などの関数を使用することなく、はるかに簡単です。例えば。 'SELECT value FROM aggTable where param = 'counter''しかし、それは依然として依然としてクエリです。 – stUrb

5

最も簡単なアプローチ:ローカルのテキストファイルに結果を書き込み、すべての要求のテキストファイルのファイル時間をnow()+ 30秒未満にしてください。そうであれば、ファイルを更新してください。更新するには、ファイルをロックする必要があります。ファイルが更新されている間、条件now()+ 30が満たされている他のユーザーは競合状態を避けるために現在の既存のファイルのみを読み取る必要があります。 役に立ったと思っています。 Stefan

+0

どのように見ることができますか、またはファイルがロックされていて、同時に200人のユーザーがWebサイトにいるようなら、問題はないでしょうか? – Maximc

0

あなたの質問の最初の部分は、基本的にあなたのページのヘッダーに含まれる総投票結果をキャッシュすることです。それは非常に良いアイデアです - それを実装する方法のアイデアはここにあります...

crontabを有効にできない場合(SSHアクセスを使わなくても、あなたのホスティングコントロールパネルでこれを設定できるかもしれません)、外部の第三者クロンジョブサービスを利用することで逃げることができます。

$fileOutput = "<"."?php\n\n"; 
$fileOutput .= '$'.$arrayName.'='; 
$fileOutput .= var_export($yourData,true); 
$fileOutput .= ";\n\n?".">"; 
$handle = fopen(_path_to_cache_file,'w+'); 
fwrite($handle,$fileOutput); 
fclose($handle); 

あなたにあなたができるだけでinclude() PHPファイルを与えるだろう - (Google has many results for this)...

毎回あなたのcronジョブを実行すると、あなたは、単にいくつかのPHPの配列を含むファイルを作成/更新することができますヘッダーのマークアップをクリックして$arrayNameという名前の変数$yourDataにアクセスできます。

1

可能であれば、memcachedを使用して調べることができます。追加するデータの有効期限を設定できます。

最初にクエリを実行すると、結果に関連付けられたクエリテキストのmd5が書き込まれます。その後のクエリでは、memcached内のデータを探します。期限が切れている場合は、SQLクエリをやり直してmemcachedに書き直すことができます。

2

サーバーで許可されている場合は、ファイルの代わりにいくつかのキャッシュメカニズム(例:APC)を使用する方が効率的です。

+0

APCでは整数を増やすことができます:http://www.php.net/manual/en/function.apc-inc.php – gcochard

関連する問題