Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Funzione ob_start() non viene eseguita

    Ciao a tutti,

    ho un problema con il buffer ob_start(). Stamattina ho scritto un piccolissimo script per capire il funzionamento del buffer, poichè dovrei applicarlo ad uno script che impiegaci rca 24h a girare.
    Ovviamente lanciare lo script e non vedere nessun output per 24h non è molto comodo, dovrei riuscire a capire ogni volta quale chiamata API sta eseguendo.

    Ecco qui il piccolo codice:

    Codice PHP:
    <?php

    ob_start
    ();

    ini_set('output_buffering''On');

    $stringa 'Ciao amici';

    for(
    $i=0$i<10$i++){

    echo 
    $stringa.$i."<br>";
    flush();

    }

    ?>
    Vorrei capire perchè non printa l'output ad ogni ciclo ma solo quando lo script termina.
    Grazie
    Ultima modifica di cressisr; 26-07-2016 a 15:23

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Scusa. Ma trattandosi di un linguaggio lato server avrai l'output a video quando lo script sarà terminato mica ogni tot minuti come sembri pensare.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Quote Originariamente inviata da badaze Visualizza il messaggio
    scusa. Ma trattandosi di un linguaggio lato server avrai l'output a video quando lo script sarà terminato mica ogni tot minuti come sembri pensare.
    L'output viene inserito in un buffer che viene svuotato o mano a mano che viene richiamato flush/ob_flush, o in alternativa quando lo script termina.

    http://php.net/manual/en/function.ob-flush.php
    Qui trovi maggiori informazioni.
    Ultima modifica di cressisr; 26-07-2016 a 21:50

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Scusa (ancora una volta) ma se vuoti il buffer come fai a mandare l'output al browser (lato client) senza che lo script php (lato server) finisca ?
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Se si tratta di un lavoro che dura a lungo e se fossi in te guarderei i Crontab che consentono di eseguire codice php in batch. Potresti inserire ogni tot tempo un record in una tabella e con uno semplice script php vedere a che punto sei dello svolgimento del batch.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  6. #6
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    Fatti un log su file di testo con le informazioni che ti serve monitorare.
    Poi ti fai una paginetta che ti faccia lanciare lo script e legga il contenuto del file di log (ad esempio, con ajax).

    Certo che uno script PHP da 24 ore mi fa un po' impressione, sicuro non ci sia un altro metodo?

  7. #7
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Se si tratta di un lavoro che dura a lungo e se fossi in te guarderei i Crontab che consentono di eseguire codice php in batch. Potresti inserire ogni tot tempo un record in una tabella e con uno semplice script php vedere a che punto sei dello svolgimento del batch.
    Il problema del crontab è che comunque dovrei far salvare in un file gli output dello script perchè senò non saprei a che punto è arrivato lo script.

    Purtroppo lo script deve fare migliaia di chiamate API e il tempo di ogni chiamata non può essere ridotto più di tanto. Al momento lancio gli script da terminale, però volevo inserirli in una pagina in modo che se dovesse lavorarci qualcuno meno pratico avrebbe il lavoro semplificato.

    Per questo ho pensato al buffer di output, alla fine è una semplice funzione che serve proprio a questo, ma non riesco a capire perchè nel serve in cui sto lavorando non funziona. Ho provato anche a modificare il php.ini, sia da root sia da ini_set, ma non cambia assolutamente nulla.

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Il comportamento del buffer dipende da diversi fattori, anche dal browser

    http://php.net/manual/en/function.flush.php

    Ad esempio, nella mia macchina per avere l'effetto che vuoi tu devo fare:

    Codice PHP:
    @ini_set('implicit_flush'1);
    $stringa 'Ciao amici';
    for(
    $i=0$i<10$i++){
       echo 
    $stringa.$i."<br>";
        
       
    ob_flush();
       
    flush();
       
    sleep(2);  // messo giusto per enfatizzare lo "stream"

    Questo funziona su chrome, ma su firefox no. Questo credo dipenda dal fatto che ff bufferizzi i dati in input prima di mostrarli.
    Di fatti facendo:

    Codice PHP:
    @ini_set('implicit_flush'1);
    $stringa 'Ciao amici';
    // aumento i dati da inviare
    for($i=0$i<1024$i++){   
        
    $stringa.='ii';
    }
    for(
    $i=0$i<10$i++){
        echo 
    $stringa.$i."<br>";
         
        
    ob_flush();
        
    flush();
        
    sleep(2);

    anche firefox mostra i dati senza attendere la fine dello script.

    Detto ciò credo che la soluzione cron + ajax magari appoggiandoti ad un db sia meglio. Insomma, uno script che dura 24h...
    Quando fai partire lo script aggiungi una riga ad una tabella, poi aggiorna ogni tot.
    A questo punto ti serve solo un secondo script che va a leggere sulla tabella e vede a che punto si trova
    Ultima modifica di boots; 27-07-2016 a 12:26

  9. #9
    Vi ringrazio per le risposte, salvare gli output su un file e/o su tabella era una scelta gia presa in considerazione ma avevo intenzione di approfondire di più l'aspetto del buffer output.
    Ovviamente non lascerò nulla in sospeso, continuerò a fare dei test e a vedere perchè continua a non andare sul mio server.

    Ve la butto lì: può essere un problema di configurazione di nginx?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.