En-tête" Transfer-Encoding: chunked " en PHP

je veux ajouter l'en-tête Transfer-Encoding: chunked au fichier que je outpute( son texte simple généré), mais quand j'ajoute:

header("Transfer-Encoding: chunked");
flush();

le navigateur ne veut pas ouvrir le fichier.

de La page web ... peut-être temporairement vers le bas ou peut-être déplacé en permanence à une nouvelle adresse web.

ce que je dois faire pour que cela fonctionne?

7
demandé sur Tim Cooper 2011-01-26 23:39:28

4 réponses

vous devez envoyer le Content-Length avec chaque morceau que vous envoyez. Regardez Wikipedia pour une première impression, à quoi ressemble un encodage tronqué. Ce n'est pas si insignifiant et dans de nombreux cas surdimensionné.

mise à jour: Vous envoyez d'abord les en-têtes, car ils doivent toujours être envoyés avant tout contenu (même avec encodage tronqué). Puis vous envoyez (pour chaque morceau) la taille (en hexadécimal) suivie du contenu. Rappelez-vous flush() après chaque morceau. Enfin, vous devez envoyer un morceau de taille zéro pour s'assurer que la connexion se ferme correctement.

ce N'est pas testé, mais quelque chose comme ça

header("Transfer-Encoding: chunked");
echo "5\r\n";
echo "Hello";
echo "\r\n\r\n";
flush();
echo "5\r\n";
echo "World";
echo "\r\n";
flush();
echo "0\r\n\r\n";
flush();
4
répondu KingCrunch 2011-01-26 21:13:18

comme les membres précédents ont dit que vous devez suivre le format de transfert chunked encoding.

dans l'exemple suivant, je montrerai comment vous pouvez utiliser une fonction utilisateur pour suivre les règles de format:

<?php
//set headers
header('Transfer-Encoding: chunked');
header('Content-Type: text/html');

//browsers collect first 1024 bytes
//and show page only if bytes collected
//so we will use space padding.
//if you cannot understand what it means
//check script with PADDING=0
define("PADDING", 16);

//caret return and new line characters as constant
define("RN", "\r\n");

//user function what get current output buffer data
//and prefixes it with current buffer length.
//next it call flush functions
function flush_data(){
    $str=ob_get_contents();
    ob_clean();
    echo dechex(strlen($str)).RN.$str.RN;
    ob_flush();
    flush();
}

//default HTML 5 page
echo "<!doctype html><html><head><title>Transfer-Encoding: chunked</title>";
echo "<script>";

//+padding
for($i=0;$i<PADDING;$i++){
    //64 spaces (1 block)
    echo "                                                                ";
}
echo "</script></head><body><div>";

//current output buffer will shown immediately in browser
//after this function
flush_data();

//cycle wait 1 sec before next iteration
for($i=0;$i<5;$i++)
{
    //print iteration number
    echo "$i<br>";
    flush_data();
    sleep(1);
}

echo "</div></body></html>".RN;

//terminating part of encoding format
flush_data();
echo "0\r\n\r\n";
ob_flush();
?>

Notes :

  1. vérifiez si" implicit_flush "est sur dans votre php.ini
  2. savoir si vous débordez le tampon de sortie ("output_buffering" dans de php.ini ) il sera rincé automatiquement.
3
répondu pashak 2013-01-07 15:32:47

pour moi quand j'essayais quelque chose avec "transfert-encodage: chunked" j'ai dû utiliser ce code pour le faire fonctionner:

<?php


echo "data";
header_remove("Transfer-Encoding"); 
flush();

?>

ce code aura toujours l'en-tête" Transfer-Encoding: chunked".

il définit automatiquement le titre de transfert-Encoding lorsque vous utilisez flush, mais quand il le définit manuellement, il échoue, donc pour éviter tout problème essayer de l'enlever. Assurez-vous également que vous retirez le titre sur la ligne avant de faire votre première rincer pour éviter les erreurs.

1
répondu SBoys3.com 2015-09-17 01:05:31

utiliser ob_flush(); avant flush();

code échantillon:

<?php
        header('Content-Encoding', 'chunked');
        header('Transfer-Encoding', 'chunked');
        header('Content-Type', 'text/html');
        header('Connection', 'keep-alive');

        ob_flush();
        flush();

        $p = "";  //padding
        for ($i=0; $i < 1024; $i++) { 
            $p .= " ";
        };
        echo $p;

        ob_flush();
        flush();

        for ($i = 0; $i < 10000; $i++) {
            echo "string";
            ob_flush();
            flush();
            sleep(2);
        }

?>
-2
répondu Partha Pal 2012-07-05 04:18:49