-4

当我在 jQuery 上使用 Ajax 进行查询时,尝试使用长拉的方法,但我的服务器已关闭或没有响应,我的网站变得像 stanby 一样太慢,或者冻结了我该怎么办?

我的PHP;

session_start();
$chat=new chat;
$class=new tools;

$idenvia=isset($_GET['idenvia'])? $_GET['idenvia']: '';
$idreceptor=isset($_GET['idreceptor'])? $_GET['idreceptor']: '';
$cantidad= isset($_GET['cantidad'])? $_GET['cantidad']: '';
$control=$_GET['control'];
//$ultima_modif=isset($_SESSION['fecha'])?$_SESSION['fecha']:0;
if($control==1){
echo json_encode($chat->leer_chat($idreceptor,$idenvia,$control,$cantidad,NULL));
}
if($control==2){
$dir='log/log_'.$_SESSION['id'].'.txt';
$ultima_modif=filemtime($dir);  
$modifica_actual=isset($_GET['tiempo'])? $_GET['tiempo']: 0;//0
set_time_limit(0);
while($ultima_modif<=$modifica_actual){
    clearstatcache();
    $ultima_modif=filemtime($dir);
    sleep(1);



    //echo '{"0":{"activo":2}}';    
    //flush();
}

           $res=$chat->leer_chat($_SESSION['id'],NULL,$control,$ultima_modif);  
        echo json_encode($res); 
        //unlink($dir);
        flush();    


    }

这是我的 JQUERY 代码,在这里我使用 AJAX 获取我的 php 的响应

 function leer_chat_interval(){
    $.ajax({
        url:enlace,
        type:'GET',
        async:true,
        data:{'control': 2,'tiempo':tiempo},
        success:function(dato){
            eval('var json='+dato);
                if(json[0].activo==1){
                    //if(json.length!=0){   
                        leer_chat(json[0].idenvia,json[0].idrecibe,1,json[0].nombre,json[0].mifoto,1,1);
                        $('#msg_chat'+json[0].idrecibe).attr('name',"{'recibe':'"+json[0].idenvia+"','envia':'"+json[0].idrecibe+"','foto':'"+json[0].mifoto+"'}");
                        setTimeout(function(){
                            $('#header_chat'+json[0].idenvia).css('background-color','#09C')
                            setTimeout(function(){
                                $('#header_chat'+json[0].idenvia).css('background-color','#F90')
                            },1000)
                        },1000);
                        tiempo=json[0].tiempo;
                        noerror=true;

                    }else{noerror=false;}
                },
        datatype:"json",        
        complete:function(dato){
                if(!noerror){
                setTimeout(function(){
                    leer_chat_interval()
                    },5000)
                }else{
                    leer_chat_interval();
                    noerror=false;

                    }
            },

            timeout:30000

        }); 

}
4

1 回答 1

2

你的问题是这样的:

while(1)

你不应该有一个无限循环的脚本来处理你的ajax“长轮询”;相反,每个 ajax 调用都通过一个有限的请求运行,收集结果并重复。您的示例中发生的情况是,每次触发 ajax 请求时,都会启动一个新的无限运行脚本;在积累了其中的几个之后,服务器自然会崩溃。

于 2012-08-06T20:53:53.987 回答