2012-03-14 10 views
0

私は古いphp/mysqlスタイルで書かれたテキストベースのゲームサイト(マフィアゲーム)を持っています。私はPHP/MYSQLの知識があまりなく、私はそれを学んでいます。だから私はajax経由で5秒ごとにリロードするファイルの1つに問題がある、それはメッセージ、フォーラムメッセージ、転送、攻撃などをチェックするいくつかのMySQLクエリを含んでおり、フォーラムのメッセージ、転送、攻撃など私のサイトは現在VPSを使用しています。リフレッシュレートを5秒に設定すると数秒以内にVPSがオーバーレイされ、リフレッシュ時間を20秒以上に設定する必要があります。クエリやPHP/PHPコードを最適化するための提案に問題があるかどうかを知りたい。誰にでもMysqlのクエリオーバーロードVPS

<script type="text/javascript" > 
var onOff=false; 
var replyText=''; 
window.onload=mainF; 

function hideRedNotif() 
{ 
    document.getElementById('redNotif').style.display='none'; 
} 
function mainF() 
{ 
    fetchNotif(); 
    Updtr=window.setInterval(fetchNotif,25000); 
} 
function toggleNotif() 
{ 
    document.getElementById('redNotif').style.display='none'; 
    if(onOff==false) 
    { 
     document.getElementById('parentReply').style.display=''; 
     onOff=true; 
    } 
    else 
    { 
     document.getElementById('parentReply').style.display='none'; 
     onOff=false; 
    } 
} 
function getAjxObject() 
{ 
    try { 
     var o=new XMLHttpRequest(); 
     } 
    catch(exception) 
     { 
     var o=new ActiveXObject('Microsoft.XMLHTTP'); 
     } 
     return o; 
} 

function fetchNotif() 
{ 

    roundN=document.getElementById('roundName').value; 
    var o=getAjxObject(); 
    o.open('GET','notifAjx.php?openSes=in&&tru='+roundN,true); 
    o.onreadystatechange=execute; 
    o.send(); 
    function execute() 
    { 
     if(o.readyState==4 && o.status==200) 
     { 
      var countF=0; 
      resp=o.responseText; 
      rsp=resp.split('#'); 

      dom=document.getElementById('notifM'); 

      dom.innerHTML=rsp[0]; 
      //document.getElementById('chatRoller').innerHTML=rsp[1]; 
      //if(rsp[1]!=replyText) 
      //{ 
      //document.getElementById('redNotif').style.display=''; 
      //replyText=rsp[1]; 
      //} 

     } 
    } 
} 
function sendReply() 
{ 

    var o2=getAjxObject(); 
    roundN=document.getElementById('roundName').value; 
    m=document.getElementById('replyText').value; 
    msg='&&reply=1&&msg='+m; 
    url='notifAjx.php?tru='+roundN+msg; 
    o2.open('GET',url,true); 
    document.getElementById('replyText').value=''; 
    o2.onreadystatechange=execute; 
    o2.send(); 
    function execute() 
    { 
     if(o2.readyState==4 && o2.status==200) 
     { 

     } 
    } 
} 

</script> 

UPDATE-ありがとう:以下は、5秒ごとに

<?php 
include("funcs.php"); 

global $tab, $time, $id, $tru, $old; 
$round=$_GET['tru']; 
$tO=0; 
$moFo='r'.$round.'_mafiosi'; 
$brd=$tab['board']; 

$query="select msg,atk,ivt,transf from $moFo where id='$id'"; 
$result=mysql_query($query); 
$ans=mysql_fetch_assoc($result); 
foreach($ans as $key=>$value) 
{ 
$tO+=$value; 
} 
$rtn='#'.$mafioMsg; 
echo "$tO$rtn"; 
?> 
#以下

および再ロードする必要が私のファイルajax.phpのコードは、私が使用していますjqueryの/ Javascriptをされています私の問題をチェックするために、私は私のDBテーブルのスクリーンショットを撮った。それが助けになるか、私に他に何を提供すべきかを教えてください。

http://i.imgur.com/VJSU2.jpg

http://i.imgur.com/5O6T0.jpg

私はどんな提案/助けに感謝します。

おかげ&よろしく のPrashantに

+0

クエリが非常に遅い場合は、データベーステーブルに問題がある可能性があります。あなたはそのテーブルにインデックスを持っていますか? – applechief

+0

あなたのIDフィールドは主キーですか? (あなたのMySQLテーブル構造を投稿してください)また、サーバー上で遅いクエリを記録し、このクエリがどれくらいかかるかを確認できますか?問題に応じて、テーブル構造を改善し、エンジンをInnoDBに変換することが役に立ちます。 – Ynhockey

+0

あなたの質問は、フルテーブル構造( 'SHOW CREATE TABLE $ moFo'の出力)、' SHOW INDEXES FROM $ moFo'およびクエリのEXPLAINの詳細で更新してください。 – nnichols

答えて

1

をテーブル「$ moFo」 でインデックスをチェックし、確認してくださいいただきました!あなたは、それらをアーカイブまたはシャーディングを使用しない、その高い場合には、扱っているデータの量。

+0

あなたはおそらくデータベース、テーブル、クエリを最適化する必要があります。一方、Johnoの答えは非常に洞察に満ちています。 –

1

私はあなたの非同期要求が5秒以上かかる場合は、バックログを取得し始めるので、問題があると思います。これは直感的ではないかもしれませんが、非同期要求を少し同期させることをお勧めします:

現在、レスポンスが戻ってきたかどうかにかかわらず、5秒ごとにチェックを実行するためにsetIntervalを使用しています。あなたが代わりにできることは、setTimeoutを使用して起動させ、成功したかどうかにかかわらず、応答が戻ったときに別のタイムアウトを設定することです。この方法では、あなたの応答は決して重なり始めることはありません。

実際に

:それは

Updtr=window.setTimeout(fetchNotif,25000); 

を処理しています一度

は、あなたはその1をラップすることをお勧めします

function mainF() 
{ 
    fetchNotif(); 
    Updtr=window.setTimeout(fetchNotif,25000); 
} 

はその後、別のタイムアウトを設定するには、あなたのfetchNotif() execute()機能を変更するあなたのmainF()機能を変更しますifreadyState == 4を確認しますが、を確認しないでください前回の試行が失敗した場合でも、試してみることをお勧めします。

+0

明らかに、これにより、前の要求が実行されている間に要求が阻止されます。実際の応答時間を改善するためのデータベースの最適化に関する他の助言に従うことをお勧めします。 – Johno

+0

私の個人的な意見はあなたの助言が役立つはずです私はそれがデータベースを最適化するより私にはあまり技術的ではないとしてあなたの提案を変更するつもりです。私は結果を見ると、私はあなたを更新します。前もって感謝します。 –