While loop blocca la pagina web hosting

di il
3 risposte

While loop blocca la pagina web hosting

Buona sera, in questo codice voglio vedere l’evoluzione della variabile X(incremento unitario), in maniera rallentata di modo che si possa apprezzare ad occhio nudo L’incremento di X.

Quando provo Questo codice su un local host Attraverso il software XAMPP, il codice PHP funziona correttamente.

Quando provo lo stesso codice su un web hosting (freeWHA) la pagina si blocca completamente finché il ciclo while non si conclude, ed una volta concluso la pagina si caricherà con tutto l’output stampato.

Questo è il codice:
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>

</head>
<body>

    <?php
    $x=0;
        while($x<2000) {
            $x = $x + 1;
            echo "x = ". $x. "</br>";
            ob_flush();
            flush();
            usleep(1000000);     //1 seconds = 1000000
           }
    ?>
    
</body>
</html>
Come posso fare per fare sì che anche nel web hosting che sto usando la pagina stampi gradualmente l’output della variabile X?

In generale che cosa dovrei cercare per tentare di risolvere questo problema?

Dovrei utilizzare forse Javascript?

Vi ringrazio in anticipo, qualsiasi consiglio è ben accetto.

3 Risposte

  • Re: While loop blocca la pagina web hosting

    Ciao benvenuto riemanncode
    Penso che come lo chiama php "output buffering control" sia diverso o comunque non come previsto. [Code]ini_set('output_buffering', 'On'); ini_set('implicit_flush', 'Off'); ini_set('display_startup_errors', 'On'); ini_set('display_errors', '1'); error_reporting(-1); Devi usare manualmente ob_start() se output_buffering non è abilitato.
    Poi se la variabile non supera i limiti potresti provare l'interazione dentro l'involucro variabile array e stampare da indice 0 al susseguirsi con sequenze di un secondo. Cioè un while e un foreach (che da php 7.3 dovrebbe essere il ciclo più veloce).
  • Re: While loop blocca la pagina web hosting

    Ciao Hormus, ho provato ad inserire il pezzo di codice "ini_set" nel mio script, ma non cambia nulla purtroppo.
    Sicuramente andrò a studiarmi bene tutta la documentazione sul buffer in questi giorni.

    Nel frattempo ho trovato una soluzione arrangiata da un vecchio post trovato su stackoverflow che suggeriva questa guida: .
    utilizzando questo codice l'ho riadattato al mio (per avere una output "progressivo" della variabile X) rendendolo più semplice possibile
    <!DOCTYPE html>
    <head>
        <meta charset="UTF-8">
        <title>Loop</title> 
       
    
        <?php   //https://stackoverflow.com/questions/10144780/how-do-echo-out-progress-on-mamp-using-flush/10145076#10145076
            ob_start();
            
            ob_implicit_flush(true);
            
            set_time_limit(0);
    
    
        $buffer = str_repeat(".", 16384);
        echo $buffer."\r\n<br />\r\n";
    
        for ($i=0; $i<20; $i++) {
            echo ($i+1).""."\r\n<br />\r\n".$buffer."\r\n<br />\r\n";
            ob_flush();
            flush();
            //sleep(1);
            usleep(500000);
        }
    
    
            ob_end_flush();
        ?>
      
    
    </body>
    </html>

    In pratica il $buffer iniziale era settato a 4096 byte e vedevo che mi "stampava" 4 valori di X ogni volta, ho provato ad aumetare $buffer = str_repeat(".", 8000); ad 8000 ed ho visto che "stampava" 2 valori alla volta. Ho quindi provato con un buffer di 16000 byte ed ecco che sono riuscito ad arrivare a ciò che cercavo di fare, perchè mi stampava una valore alla volta

    Parlando sinceramente è una vera schifezza di codice, perché non ha senso avere 16000 puntini per riga per far si che ci sia un output progressivo. Io vengo da una programmazione non web (Rstudio / python) dove ho sempre "debuggato" stampando qualsiasi parte del codice, per vedere come funziona il programma.

    detto questo: non so se in un framework backend come php quello che sto facendo abbia o meno senso...

    La mia idea di progetto è generare dei numeri casuali in modo tale da creare una tabella (più avanti anche un grafico) che mi mostri l'evoluzione e l'update/stream dei numeri che sto simulando (che nel progetto finale potranno essere sia dati di un sensore, che un orologio digitale.. ecc..). --> In sostanza qualcosa che "mi stampi" nella pagina una variabile in costante aggiornamento.

    Cosa dovrei cercare per fare qualcosa di questo tipo? ti ringrazio per l'aiuto!
  • Re: While loop blocca la pagina web hosting

    Ho trovato più info, output_buffering PHP_INI_PERDIR Entry can be set in php.ini, .htaccess, httpd.conf or .user.ini e che quindi non è possibile impostare tramite ini_set.

    Poi guarda questo codice con e senza output_buffering (manuale con ob_start), è con errore. Dovrebbe stampare solo l'ultima iterazione.
    Se ini_get non produce errori (a volte era bloccato) si potrebbe fare tipo così
    if(!ini_get('output_buffering'))
    ob_start();
    https://3v4l.org/PKCP9#v7.4.2
    Sarebbe lecito trattenere l'output
    //se output_buffering non abilitato
    ob_start(); 
    phpinfo(); 
    sleep(10);
    di phpinfo indistintamente se uso primo o dopo il comando sleep.

    Comunque per forzare la visualizzazione degli errori dovrai impostare su php.ini o come prima riga di codice (gli errori fatali non verranno rivelati se abilitati con ini_set e se in quel file). Dunque tag apertura <?php e chiusura ?> prima di qualunque output compreso anche html (in php è chiamata sintassi alternativa o anche sintassi a blocchi).

    Poi se ricordo bene i buffer consentono anche l'annidamento, cioè da gerarchia. Se trovo sul sito bugs.php.net ti informo.

    Edit: dovrai modificare direttamente il DOM poiché è html e dunque markup cioè interpretato.
Devi accedere o registrarti per scrivere nel forum
3 risposte