Richieste Ajax Molto Lente

Ciao a tutti!

Ho dei problemi di performance con Yii, quando faccio una richiesta Ajax ad un controller, anche solo per restituire un numero ci mette almeno 3 secondi, che se carico diverse richieste sono tanti …

Il problema credo sia dovuto al fatto che per fare una richiesta Ajax carica tutti i controller, c’è un modo per risolvere questo problema?

Per spigarmi meglio io nel controller ho messo una actionGetSaldo() e con jquery faccio una richiesta all’indirizzo: baseUrl/controller/GetSaldo

questa richiesta prende 3 secondi, come mai? Come faccio a velocizzare il processo?

Grazie mille per la disponibilità.

Ciao!

Puoi mostrarci il codice di actionGetSaldo()?

posta la richiesta che fai con jquery pure. non credo sia il problema che dici, cioè che carica tutti i controller, al massimo carica il controller che richiedi e a meno che non sia un controller gigante o che ha dei problemi non dovresti avere un risultato del genere.

altra domanda, stai lavorando tutto in locale? con una richiesta post o get normale hai problemi di questo tipo, sempre sullo stesso controller? magari anche sulla stessa action?

Hai provato a eseguire "[color=#1C2837][size=2]baseUrl/controller/GetSaldo"[/size][/color] dal browser per vedere se e proprio li che si "spendono" i 3 secondi ?

Grazie mille per le risposte allora il codice GetSaldo semplice fa una QUERY al db e restituisce una somma.

@st4nny: Andando avanti il fatto è che il problema non è solo a quella richiesta in particolare, ma è lento su tutte le richieste Ajax che faccio.

Il sito è tutto in locale.

@Maurizio Domba: sì andando all’indirizzo non è così lento, è lento solo quando chiamo Ajax.

Avete qualche idea? Grazie!

AGGIORNAMENTO: Scrivendo la stessa risposta in json al di fuori di Yii la risposta diminuisce da 3 secondi a 300ms, quindi il problema è di Yii, ma non capisco dove sia il problema

Ma come mai sei arrivato alla conclusione che il problema e di Yii?

Se andando direttamente all’indirizzo non e lento alora non e Yii… il problema e nel ajax/jQuery e quello che fa prima/dopo della ajax chiamata… ci puoi far vedere il codice che fa la chiamata ajax()

Questo è un esempio:


$.get(baseUrl+'/BankAccount/GetSaldo/'+id, {},

		function(data){

			$("#saldoTotale span").html(data);

		});

Inoltre la stessa chiamata fatta ad uno script che produce lo stesso risultato fuori da Yii ha un tempo di riposta di 50ms contro i 4000ms della chiamata al controller di Yii.

Grazie, ciao!

prova così e facci sapere, forse non usi yii come dovresti, o forse c’è qualcosa nel tuo codice che non torna

nella view:

funzione js




<script type="text/javascript">

function test_func()

{

    <?php echo CHtml::ajax(array(

            'url'=>array('bankaccount/getsaldo/'.$model->id.''),

            'data'=> "js:$(this).serialize()",

            'type'=>'post',

            'dataType'=>'json',

            'success'=>"function(data)

            {

               $("#saldoTotale span").html(data.html);

            } ",

            ))?>

    return false; 

}

</script>



Bottone:




<?php echo CHtml::button('Test ajax',array('onclick'=>'test_func();return false;'))?>



nel controller:




public function actionGetsaldo($id)

{

    if (Yii::app()->request->isAjaxRequest)

    {

        $dato_calcolato = 100;

	echo CJSON::encode(array('html'=>$dato_calcolato));

	exit;

    }

		

}



st4nny grazie per la risposta ma è comunque lento, ti riporto la funzione:




if (Yii::app()->request->isAjaxRequest)

	    {

	        $dato_calcolato = BankAccount::getSaldoAl($id);

	        echo CJSON::encode(array('html'=>$dato_calcolato));

	        exit;

	    }



Dove BankAccount::getSaldoAl($id);

è




public static function getSaldoAl($id, $data = 0){

		

		if( $data = 0 ){

			$data = time();

		}

		

		//$startBalance = BankAccount::model()->findByPk($id)->opening_balance;

		

		$startBalance = 1000;

		

		$sql = 'SELECT value, type FROM trasaction 

					WHERE bank_account_id = ' . $id . ' AND date<'.$data;

					

		$cc=Yii::app()->db->createCommand($sql)->queryAll();

		

		$saldo = $startBalance;

		

		foreach( $cc as $t ){

			if( $t['type'] == 'in' ){

				$operator = 1;	

			}

			else {

				$operator = -1;

			}

			$saldo += $t['value']*$operator;

		}

		

		return $saldo;

	}




sbaglio o la query non è chiusa?

In che senso?

Scusa :)

sbagli =)

Questo codice:




                if( $data = 0 ){

                        $data = time();

                }



forse andava scritto così?




                if( $data == 0 ){

                        $data = time();

                }



no perchè io me le scrivo sempre in questa maniera, però per come si concatenano le stringhe in php non ci dovrebbero essere problemi.




 $sql = 'SELECT value, type FROM trasaction 

         WHERE bank_account_id = ' . $id . ' AND date<'.$data.'';



cmq se a $dato_calcolato assegni un valore statico, il dato ti ritorna dopo 3 secondi?

perchè se non è così, il problema ce l’hai in getSaldoAl, è questa funzione ad essere lenta

non la richiesta ajax. Poi sulla rilevazione che ti ha fatto sensorario concordo, ma non so se inficia sul funzionamento della funzione.

Ciao,

Sono un babè di Yii quindi ho poca esperienza. Pero’ ieri, ho avuto un problema simile, con la questione delle province e comuni. Dopo che con la select scegli la provincia, la seconda select si aggiorna di conseguenza. Con FF 15.xx sul primo onchange, 3 o 4 secondi di elaborazione e poi andava, anche se con Firebug vedevo che la richiesta XHR era molto rapide, invece con Chrome filava subito liscio. Vedi se cambiando Browser hai lo stesso problema.

Ciao,

Stefano