Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    44

    long polling e problemi con host

    Salve a tutti, sto brancolando nel buio a causa del seguente problema:

    ho realizzato una chat e sistema di notifiche mediante il modello long polling, perfettamente funzionante in locale. Carico sull'host e una volta online mi accorgo che comunque il ciclo while viene rotto alcune volte senza motivo arbitrariamente dall'host, causando a volte anche il crash dello stesso. Non riesco ad individuare la causa perchè il problema è del tutto stocastico. Grazie a chiunque perderà un po' di tempo per me.
    Di seguito il codice

    codice php:

    codice:
    header('Content-Type: application/json; charset=UTF-8');
    $time_pre = microtime(true);
    session_start();
    $g_session_id = $_SESSION['session_id'];
    session_write_close();
    
    $value=calculate_value();
    
    while(true){
        sleep(0.1);   
        $actual_value=calculate_value();
        if($actual_value!=$value){
            die(json_encode(array("value"=>$actual_value)));
        }
        $time_post = microtime(true);
        $exec_time = $time_post - $time_pre;
        if($exec_time>20){
             die(json_encode(array("no_result"=>'no_result')));
        }
    }

  2. #2
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Qual'è il limite di tempo massimo di esecuzione dello script impostato? (http://php.net/manual/it/function.set-time-limit.php) Controlla inoltre i tuoi logs: c'è qualche errore dovuto al fatto che hai raggiunto il limite massimo di memoria disponibile? Cosa fa calculate_value()?
    Il tuo web server inoltre può giocare un ruolo in tutto questo. A seconda della configurazione mod_php può decidere se uccidere o meno un processo, se non riesce a gestire il numero di richieste. php_fpm ha un parametro chiamato "request_terminate_timeout" che è l'equivalente di max_execution_time di php, che potrebbe fare terminare lo script prima lo script. E così via...
    Diciamo semplicemente che php non è adatto per avviare lunghi processi in quel modo. Il mio consiglio è di usare i websocket: non siano più nel 2005

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    44
    Ciao! grazie per la veloce risposta!
    Quote Originariamente inviata da .Kurt Visualizza il messaggio
    Qual'è il limite di tempo massimo di esecuzione dello script impostato? (http://php.net/manual/it/function.set-time-limit.php)

    non ho impostato set-time-limit, avevo pensato di interrompere il ciclo calcolando il tempo di esecuzione e se supera i 20 secondi fare nuovamente la chiamata ajax. dovrei impostarlo invece?
    Quote Originariamente inviata da .Kurt Visualizza il messaggio
    Controlla inoltre i tuoi logs: c'è qualche errore dovuto al fatto che hai raggiunto il limite massimo di memoria disponibile?
    adesso li guardo se 1and1 me li fa vedere
    Quote Originariamente inviata da .Kurt Visualizza il messaggio
    Cosa fa calculate_value()?
    semplice lettura a db dei dati che voglio leggere e ritorna il numero per il confronto!

  4. #4
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    non ho impostato set-time-limit, avevo pensato di interrompere il ciclo calcolando il tempo di esecuzione e se supera i 20 secondi fare nuovamente la chiamata ajax. dovrei impostarlo invece?
    Va benissimo interrompere esplicitamente lo script dopo tot. tempo. Il limite di default dovrebbe essere 30 secondi, ma controlla se non sia impostato a meno. Se "calculate_value" non ci impiega secondi per restituire il risultato, non dovrebbero esserci problemi.

    semplice lettura a db dei dati che voglio leggere e ritorna il numero per il confronto!
    Fai attenzione, perché da come la descrivi sembra che tu stia facendo migliaia di query al database, di cui molte (se non tutte) notificheranno semplicemente che non c'è nulla di nuovo. Cerca "push/pull technology" sul web, e concentrati sul "push"
    Ultima modifica di .Kurt; 19-01-2016 a 20:03

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    44
    Si in effetti ne faccio diverse. Ogni calculate_value() sono 3 query diverse. 30 query al secondo che notificano che non c'è niente di nuovo. E' una porcata vero?
    Il fatto è che crashava con soli due utenti connessi. ogni tanto, non ad ogni esecuzione del loop, anzi una tantum.

  6. #6
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    E' una porcata vero?
    Diciamo che puoi scegliere altre alternative per fare questo lavoro. Penso che la tua attuale implementazione non sia adatta per essere utilizzate da più persone contemporaneamente. Il tuo database potrebbe anche non sopportare il carico, dipende dal tuo ambiente.

  7. #7
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Ciao, scusate l'intromissione, ma prima di aprire un nuovo thread per una cosa che assilla anche me, volevo almeno sfruttare questo.
    anche io sto tentando di implementare una piccola chat per un GDR che sto costruendo e anche io ho incontrato alcuni problemi simili, più che altro con la sincronizzazione dei messaggi dei vari utenti.
    Mi spiego
    Anche io avevo pensato ad una implementazione in stile server ( ciclo while in attesa di un evento ) e vedo che la mia idea anche se implementata in modo diverso ( ho letto anche l'altro thread ) era quanto meno giusta.
    Però al momento di mettere mano al codice mi sono venuti parecchi dubbi sul metodo di funzionamento del tutto, ovvero come hai risolto la lettura del database in funzione delle molteplici richieste che arrivano da ogni utente collegato?
    Dalla tua implementazione noto che chiami calculate_value() una volta fuori dal ciclo e poi dentro fino a quando un evento ( modo di dire ) non lo fa uscire.
    Ma come funziona calcolate_value()?
    Io ho questo dilemma: leggere l'ultimo record inserito non mi garantisce affatto di aver letto l'ultimo messaggio inserito dal'utente X perché nel frattempo Y potrebbe averne messo dentro un altro, e speravo di risolverlo con un implementazione simile alla tua ma ho dubbi sul suo funzionamento.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.