-4

jQueryでAjaxを使用してクエリを実行している場合、ロングプルの方法を使用してみてください。ただし、サーバーがシャットダウンするか、応答しない、スタンビーのようにWebサイトが遅くなる、またはフリーズするなど、どうすればよいですか?

私の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 に答える