Я хочу добавить Transfer-Encoding: chunked
header в файл, который я выводил (его только что сгенерированный простой текст), но когда я добавляю:
header("Transfer-Encoding: chunked"); flush();
браузер не хочет открывать файл.
Веб-страница на … может быть временно недоступна или, возможно, переместилась на новый веб-адрес.
что мне нужно сделать для этого?
Вам необходимо отправить Content-Length
с каждым отправленным вами куском. Посмотрите на Википедию для первого впечатления, как выглядит кодированное кодирование. Это не то, что тривиально и во многих случаях его негабарит.
Обновление: сначала вы отправляете заголовки, потому что они должны всегда отправлять их перед любым контентом (также с кодировкой с чередованием). Затем вы отправляете (для каждого фрагмента) размер (в шестнадцатеричном виде), за которым следует содержимое. Помните flush()
после каждого куска. Наконец, вы должны отправить нулевой размер, чтобы убедиться, что соединение закрывается должным образом.
Его не тестировали, но что-то вроде этого
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();
Как говорили предыдущие участники, вы должны следовать формату кодирования с передачей пакетов.
В следующем примере я покажу, как вы можете использовать одну пользовательскую функцию для соблюдения правил формата:
<?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(); ?>
Примечания :
Для меня, когда я пытался что-то с помощью «Transfer-Encoding: chunked», мне пришлось использовать этот код, чтобы он работал:
<?php echo "data"; header_remove("Transfer-Encoding"); flush(); ?>
Этот код по-прежнему будет содержать заголовок «Transfer-Encoding: chunked».
Он автоматически устанавливает заголовок Transfer-Encoding, когда вы используете флеш, но когда он устанавливает его вручную, он терпит неудачу, поэтому для предотвращения каких-либо проблем попробуйте удалить его. Также убедитесь, что вы удаляете заголовок на линии до того, как сделаете свой первый сброс, чтобы предотвратить ошибки.
Использовать ob_flush();
перед flush();
Образец кода:
<?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); } ?>