2012-03-14 57 views
0

我有一個基於文本的遊戲網站(黑手黨遊戲)寫在舊的PHP/MySQL的風格。我對PHP/MYSQL知之甚少,但我正在學習它。所以,我有文件的其中一個通過AJAX重新加載每5秒問題,它包含一些MySQL查詢,檢查郵件,論壇,郵件,傳輸,攻擊等,並視檢查顯示警告用戶,如果他們得到任何新的消息,論壇的消息,傳輸,攻擊等我的網站現在正在使用VPS,如果我刷新率設置爲5秒它overlaods幾分鐘之內VPS所以我必須刷新時間設置爲20秒以上。我想知道是否有任何問題與查詢或任何建議優化查詢/ PHP代碼。下面是我的文件ajax.php的代碼,需要每5秒MySQL查詢超載VPS

<?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"; 
?> 

及以下重新加載的jQuery的/ JavaScript的,我使用:

<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> 

最新情況:謝謝大家爲了檢查我的問題,我採取了我的數據庫表的截圖,請檢查是否有幫助,或讓我知道我還應該提供什麼。

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

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

我歡迎任何建議/幫助。

感謝&問候 PRASHANT

+0

如果查詢是很慢的,它可能是與你的數據庫表中的問題。你在桌上有索引嗎? – applechief 2012-03-14 11:47:27

+0

您的ID字段是主鍵嗎? (請發佈您的MySQL表結構)另外,您能否在服務器上記錄緩慢的查詢並查看此查詢需要多長時間?根據問題的不同,改進表結構和將引擎轉換爲InnoDB可能會有所幫助。 – Ynhockey 2012-03-14 11:47:35

+0

請使用以下詳細信息更新您的問題 - 全表結構(從SHOW CREATE TABLE $ moFo輸出),SHOW INDEXES FROM $ moFo和解釋查詢。 – nnichols 2012-03-14 11:52:17

回答

1

請在表「$ MOFO」 索引和檢查什麼你正在處理的,如果它的高然後做歸檔,或使用分片的數據量。

+0

你應該優化你的db,表和查詢,另一方面,Johno的回答也非常有見地。 – 2012-03-14 12:35:55

1

我想到你可能有問題,因爲如果你的異步請求的時間超過5秒,你會開始得到積壓。這可能聽起來違反直覺,但我建議使您的異步請求更加同步:

目前,您正在使用setInterval每五秒運行一次檢查,無論響應是否已恢復。你可以做的是使用setTimeout來啓動它,然後在你的響應返回時設置另一個超時,無論它是否成功。這樣,你的回答永遠不會重疊。

在實踐中:

更改mainF()功能是

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

然後改變你的fetchNotif() execute()功能設置另一個超時處理完畢後就會

Updtr=window.setTimeout(fetchNotif,25000); 

您可能需要換一個在if檢查readyState == 4但不檢查status == 200,因爲即使先前的嘗試失敗,您可能也希望它再次嘗試。

+0

顯然,這只是防止前一個請求正在運行時的請求。您可能想要遵循其他有用的建議:數據庫優化以提高實際響應時間。 – Johno 2012-03-14 12:01:39

+0

我的個人意見是你的建議應該是有幫助的我將會對你的建議進行修改,因爲它對我來說技術不如優化數據庫。一旦我看到結果我會更新你。提前致謝。 – 2012-03-14 12:39:53