В течение последних двух месяцев я получал следующую ошибку на консоли разработчика Chrome:
net::ERR_INCOMPLETE_CHUNKED_ENCODING
Симптомы:
Серверная среда:
Это происходит со мной на нашем собственном сервере Apache. Это не происходит ни с кем другим, т.е. Никто из наших пользователей не сталкивается с этой проблемой, как и никто другой в нашей команде разработчиков.
Другие люди получают доступ к тому же серверу с точно такой же версией Chrome. Я также попытался отключить все расширения и просмотр в режиме инкогнито — безрезультатно.
Я использовал Firefox, и происходит то же самое. Усеченные файлы и еще много чего. Единственное, что Firefox не вызывает никаких ошибок консоли, поэтому вам нужно проверить HTTP-запрос через Firebug, чтобы увидеть проблему.
Заголовки ответа от Apache:
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:close
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Mon, 27 Apr 2015 10:52:52 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Pragma:no-cache
Server:Apache/2.2.22 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.10-1ubuntu3.8
Во время тестирования я смог решить проблему, применив HTTP 1.0 в моем файле htaccess:
SetEnv downgrade-1.0
Это избавляет от проблемы. Однако принудительное использование HTTP 1.0 вместо HTTP 1.1 не является правильным решением.
ОбновитьПоскольку я являюсь единственным, кто столкнулся с этой проблемой, я решил, что мне нужно потратить больше времени на выяснение того, было ли это проблемой на стороне клиента. Если я захожу в настройки Chrome и использую опцию «Восстановить по умолчанию», проблема исчезнет минут 10-20. Тогда это возвращается.
ХОРОШО. Я трижды проверил это, и я Уверен на 100% что это вызвано моим антивирусом (ESET NOD32 ANTIVIRUS 5).
Всякий раз, когда я отключаю защиту в реальном времени, проблема исчезает. Сегодня я отключил защиту в реальном времени на 6-7 часов, и проблема никогда не возникала.
Несколько мгновений назад я снова включил его, только чтобы проблема всплыла в течение минуты.
В течение последних 24 часов я включал и выключал защиту в реальном времени, чтобы быть уверенным. Каждый раз — результат был одинаковым.
Обновление: я столкнулся с другим разработчиком, у которого была точно такая же проблема с защитой в реальном времени на его антивирусе Касперского. Он отключил это, и проблема ушла. Т.е. эта проблема, похоже, не ограничивается ESET.
Ошибка пытается сказать, что Chrome был отключен во время отправки страницы. Ваша проблема пытается выяснить, почему.
По-видимому, это может быть известной проблемой, затрагивающей несколько версий Chrome. Насколько я могу судить, проблема заключается в том, что эти версии очень чувствительны к длине контента отправляемого чанка и выраженному размеру этого чанка (я мог бы быть далек от этого). Короче говоря, немного несовершенные проблемы заголовков.
С другой стороны, может случиться так, что сервер не отправит терминалу порцию 0 длины. Что может быть исправлено с ob_flush();
, Также возможно, что Chrome (или соединение или что-то) работает медленно, поэтому, когда соединение закрыто, страница еще не загружена. Я понятия не имею, почему это может произойти.
Вот параноидальный ответ программистов:
<?php
// ... your code
flush();
ob_flush();
sleep(2);
exit(0);
?>
В вашем случае это может быть случай истечения срока действия скрипта. Я не совсем уверен, почему это должно повлиять только на вас, но это может быть сделано в кучу условий гонки? Это полное предположение. Вы должны быть в состоянии проверить это, увеличив время выполнения скрипта.
<?php
// ... your while code
set_time_limit(30);
// ... more while code
?>
Это также может быть так просто, как вам нужно обновить установку Chrome (поскольку эта проблема специфична для Chrome).
ОБНОВИТЬ: Я смог повторить эту ошибку (наконец-то), когда была выдана фатальная ошибка, когда PHP (на том же локальном хосте) был выходная буферизация. Я предполагаю, что вывод был слишком плохо искажен, чтобы быть полезным (заголовки, но мало или нет контента).
В частности, мой код рекурсивно вызывал себя случайно, пока PHP, по праву, не сдался. Таким образом, сервер не отправил порцию терминала длиной 0 — что было проблемой, которую я идентифицировал ранее.
У меня была эта проблема. Отследил это после того, как попробовал большинство других ответов на этот вопрос. Это было вызвано владельцем и разрешениями /var/lib/nginx
и более конкретно /var/lib/nginx/tmp
каталог неверен.
Каталог tmp используется fast-cgi для кэширования ответов по мере их генерирования, но только если они превышают определенный размер. Таким образом, проблема является периодической и возникает только тогда, когда сгенерированный ответ является большим.
Проверить nginx <host_name>.error_log
чтобы увидеть, есть ли у вас проблемы с разрешениями.
Чтобы исправить, убедитесь, что владелец и группа /var/lib/nginx
и все подкаталоги — это nginx.
Следующее должно исправить это для каждого клиента.
//Gather output (if it is not already in a variable, use ob_start() and ob_get_clean() )
// Before sending output:
header('Content-length: ' . strlen($output));
Но в моем случае было лучше и исправил следующее:
.Htaccess:
php_value opcache.enable 0
О боже, у меня была такая же проблема 5 минут назад. Я потратил несколько часов, чтобы найти решение. На первый взгляд отключение антивируса решило проблему на Windows. Но затем я заметил проблему на другом компьютере с Linux без антивируса. Нет ошибок в логах nginx. мой uwsgi
показал что-то про «Разбитую трубу» но не на все запросы.
Знаешь что? На устройстве не осталось места, которое я обнаружил при перезапуске сервера в журнале базы данных, и df
одобрил это. Единственное объяснение того, почему антивирус был решен, заключается в том, что он предотвращает кэширование браузера (он должен проверять каждый запрос), но браузер с некоторым странным поведением может просто игнорировать неверный ответ и отображать кэшированные ответы.
Это известная проблема Chrome. По мнению Chrome и Chromium, для этого нет универсального решения. Эта проблема не связана с типом и версией сервера, она прямо в Chrome.
настройка Content-Encoding
заголовок к identity
решил эту проблему для меня.
личность | Указывает тождественную функцию (то есть ни сжатие, ни
модификация).
Итак, я могу предположить, что в некоторых случаях Chrome не может правильно выполнить сжатие gzip.
В моем случае у меня было /usr/local/var/run/nginx/fastcgi_temp/3/07/0000000073" failed (13: Permission denied)
что, вероятно, привело к ошибке Chrome net :: ERR_INCOMPLETE_CHUNKED_ENCODING.
Я должен был удалить /usr/local/var/run/nginx/
и пусть nginx создаст его снова.
$ sudo rm -rf /usr/local/var/run/nginx/
$ sudo nginx -s stop
$ sudo mkdir /usr/local/var/run/nginx/
$ sudo chown nobody:nobody /usr/local/var/run/nginx/
$ sudo nginx
Здесь проблема была в моем Avast AV.
Как только я отключил его, проблема исчезла.
Но я действительно хотел бы понять причину такого поведения.