MySQL запрос перегрузки VPS - PullRequest
0 голосов
/ 14 марта 2012

У меня есть текстовый игровой сайт (игра Мафия), написанный в старом стиле php / mysql. Я не очень мало знаю PHP / MYSQL я изучаю его, хотя. Так что у меня проблемы с одним файлом, который перезагружается каждые 5 секунд через ajax, он содержит несколько запросов Mysql, которые проверяют сообщения, сообщения форума, передачу, атаки и т. Д., И в зависимости от проверки он показывает предупреждение пользователям, если они получают новое сообщение сообщения форума, передачи, атаки и т. д. Мой сайт использует VPS прямо сейчас, и если я устанавливаю частоту обновления 5 секунд, он перекрывает VPS в течение нескольких минут, поэтому мне нужно установить время обновления 20 секунд или более. Я хотел бы знать, есть ли проблемы с запросом или какие-либо предложения по оптимизации кода запроса / php. Ниже приведен код моего файла ajax.php, который необходимо перезагружать каждые 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";
?>
#

и ниже - 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

Буду признателен за любое предложение / помощь.

Спасибо и С уважением Прашант

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Я ожидаю, что у вас могут возникнуть проблемы, потому что если ваш асинхронный запрос занимает более 5 секунд, вы начнете получать отставание.Это может показаться нелогичным, но я рекомендую сделать ваши асинхронные запросы немного более синхронными:

В настоящее время вы используете setInterval для запуска вашей проверки каждые пять секунд, независимо от того, был ли возвращен ответ.Вместо этого вы можете использовать setTimeout, чтобы запустить его, а затем установить другое время ожидания, когда ваш ответ вернется, независимо от того, был он успешным или нет.Таким образом, ваши ответы никогда не начнут перекрываться.

На практике:

Измените свою функцию mainF() на

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

Затем измените свою функцию fetchNotif() execute()установить другой тайм-аут после его обработки

Updtr=window.setTimeout(fetchNotif,25000);

Возможно, вы захотите обернуть его в if, чтобы проверить readyState == 4, но не проверять status == 200, потому что вы, вероятно, хотите, чтобы он попыталсяснова, даже если предыдущая попытка не удалась.

1 голос
/ 14 марта 2012

проверьте наличие индексации в таблице '$ moFo' и проверьте объем данных, с которыми вы имеете дело, если он высокий, заархивируйте их или используйте шардинг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...