Question

J'ai un assez long script data mining, et dans certaines parties de ce que je fais l'écho des informations à la page (au cours d'une boucle foreach, en fait.)

Mais je remarque que l'information est envoyée à la navigation pas immédiatement comme je l'avais espéré, mais en « segments ».

Y at-il une fonction que je peux utiliser après mon écho d'envoyer toutes les données au navigateur immédiatement?

Merci.

Était-ce utile?

La solution

Vous voulez probablement flush(). Cependant, PHP utilise peut-être mise en mémoire tampon de sortie. Il y a quelques façons que cela peut changer les choses, mais en un mot, vous pouvez flush(), puis ob_flush().

Autres conseils

Vous pouvez essayer d'utiliser flush () après chaque écho, mais même cela ne garantit pas une écriture au client en fonction du serveur Web que vous utilisez.

Oui, Rembourrage votre sortie à 1024 octets provoquera la plupart des navigateurs pour commencer à afficher le contenu.

Mais nous apprenons aussi de @ réponse de personne à la question « Comment sortie rincage après chaque `echo` appeler? » que le 1024 octets effet tampon du navigateur ne se produit que lorsque le navigateur doit deviner le codage de caractères de la page, qui peut être empêché en envoyant l'en-tête Content-type adéquat (par ex . "content-type: text / html; charset = utf-8"), ou en spécifiant le jeu de caractères de contenu grâce à des balises meta html appropriées. Et cela a fonctionné aussi bien pour moi dans tous les navigateurs.

Donc, fondamentalement, tout un besoin de faire est:

header('Content-Type: text/html; charset=utf-8');
ob_implicit_flush(true);

Sans besoin de rembourrage supplémentaire ou rinçage, qui est d'une grande utilité cosmétique pour le code! Bien sûr, les en-têtes doivent être envoyés avant tout contenu, et il faut aussi assurer qu'aucune mise en mémoire tampon de sortie qui se passe.

Problème résolu certainement pour moi! S'il vous plaît (+1) @ réponse de personne autre question aussi bien si cela fonctionne pour vous. Si, bien, on rencontre encore des problèmes, je vous suggère de vérifier les réponses à cette autre question pour d'autres situations spécifiques qui pourraient empêcher presumely rinçage implicite de fonctionner correctement.

Notez également que certains navigateurs ne commencera à afficher quoi que ce soit jusqu'à ce que le corps de la réponse contient une certaine quantité de données - comme 256 ou 1024 octets. J'ai vu des applications avant que les données de pad avec un commentaire à long 1024 caractères près du haut de la page, avant de faire une chasse d'eau. Il est un peu un hack, mais nécessaire.

Ceci est valable pour Internet Explorer et Safari IIRC.

  • Si elle est la première chasse d'eau, assurez-vous que vous avez sortie au moins 1024 octets sofar (non compris les en-têtes HTTP).
  • Appel flush ()
  • Si vous pouvez déterminer qu'il ya mise en mémoire tampon de sortie en place, question ob_flush ()

J'aime utiliser simplement

while (ob_get_level()) ob_end_flush();

près du début de mon script quelque part, et puis juste

flush();

quand je veux rincer. Cela suppose que vous ne voulez pas en mémoire tampon de sortie du tout, même si elle a été mise en place avant le script (comme dans une configuration php.ini ou htaccess).

Vous devriez être en mesure d'utiliser quelque chose comme cela pour forcer la sortie à envoyer immeadiately. Mettez à la partie du code que vous voulez que la sortie à envoyer.

flush();
ob_flush();

Ouf! J'ai finalement trouvé la réponse à la question de la mémoire tampon de Google Chrome! Merci à boysmakesh pour la poussée dans la bonne direction. Voici la fonction que j'utilise:

function buffer_flush(){

    echo str_pad('', 512);
    echo '<!-- -->';

    if(ob_get_length()){

        @ob_flush();
        @flush();
        @ob_end_flush();

    }

    @ob_start();

}

Et voici comment je l'appelle:

show_view('global', 'header'); // Echos the <html><head>... tags and
                               // includes JS and CSS.

show_view('global', 'splash_screen'); // Shows a loading image telling
                                      // the user that everything's okay.

buffer_flush(); // Pretty obvious. At this point the loading view shows
                // up on every browser i've tested (chrome, firefox,
                // IE 7 & 8)

show_view('global', 'main'); // Has a loop that echos "Test $i<br>" 5
                             // times and calls buffer_flush() each time.

show_view('global', 'footer'); // End the html page and use JQuery to
                               // fade out the loading view.

Pour fonctionner parfaitement ce dans Google Chrome, essayez ceci:

$i = 0;
$padstr = str_pad("",512," ");
echo $padstr;

while ($i <= 4){
    $padstr = str_pad("",512," ");
    echo $padstr;
    echo "boysmakesh <BR> ";
     flush();
    sleep(2);
    $i = $i + 1;
}

Ee envoient 512 octets avant d'envoyer chaque écho. Ne pas oublier de mettre <BR> à la fin du contenu avant de rincer. Sinon, il ne fonctionnera pas dans Chrome, mais fonctionne dans IE.

Le rembourrage de nous des données dépend navigateur. Pour certains navigateurs, il suffit d'avoir 256 octets, mais certains ont besoin de 1024 octets. Pour le chrome, il est 512.

ignore_user_abort(TRUE); // run script in background
set_time_limit(0); // run script forever
$interval=150000;
$i = 0;

if(
  strpos($_SERVER["HTTP_USER_AGENT"], "Gecko") or
  strpos($_SERVER["HTTP_USER_AGENT"], "WebKit")
){
  # important to change browser into quirks mode
  echo '<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
}

function buffer_flush(){
    echo "\n\n<!-- Deal with browser-related buffering by sending some incompressible strings -->\n\n";
    for ( $i = 0; $i < 5; $i++ )
        echo "<!-- abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono -->\n\n";

    while ( ob_get_level() )
        ob_end_flush();

    if(ob_get_length()){
        @ob_flush();
        @flush();
        @ob_end_flush();
    }
    @ob_start();
}

ob_start(); 

do{

  if($i<10){
    buffer_flush(); 
    echo ". ";    
    buffer_flush(); 
    usleep($interval);

  } else {
    echo sprintf("<pre>%s</pre>", print_r($_SERVER,true));
    break;
  }

  $i++;

}while(true);

php 5.5 Exécution sur IIS 7, IE 11 (serveur gagner) Je trouve cela a fonctionné comme les premières lignes du fichier. Remarque mettre l'instruction while avant l'en-tête a provoqué une erreur en-tête déjà écrit.

header('Content-Type: text/html; charset=utf-8');
while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);

D'autres références à ob_flush () dans le script a provoqué une mémoire tampon n'existe pas d'erreur.

a bien fonctionné quand je le traitement d'un fichier et d'envoyer des instructions SQL au navigateur, mais quand je branché le db (ms serveur 2008) Je n'avais aucune entrée retourné jusqu'à ce que le scénario avait terminé.

cette combinaison a finalement fonctionné pour moi, basé sur la réponse de thomasrutter

while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top