Заголовок Content-Length в HHVM FastCGI является прерывистым

Может быть, это джетлаг, но я не могу заставить PHP / HHVM дать мне Тип содержимого Заголовок, когда мне это нужно.

Я развернул полный стек (MySQL, HHVM, Nginx) на машине Vagrant, и мне удалось воспроизвести проблему в тестовом сценарии:

<?php
$file='/usr/share/doc/iptables/html/NAT-HOWTO.html'; # random test file
header('Content-Length: ' . filesize($file));
echo(readfile($file));
?>

Если вы изучите заголовки с помощью curl:

hostname:~ jsimpson$ curl -I http://vagrant/test.php
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 16 Sep 2014 22:09:25 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2592
Connection: keep-alive
X-Powered-By: HHVM/3.2.0
Content-Encoding: none;

У нас есть заголовок длины контента. Однако, если мы нажмем тот же URL из Chrome и получим заголовки из инструментов Dev:

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 16 Sep 2014 22:14:41 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: HHVM/3.2.0
Content-Encoding: gzip

Нет заголовка Content-Length. Я также проверял пакет, чтобы убедиться, что заголовок не отправлен. Я могу переключиться на PHP FPM, и он отправляет заголовок.

1

Решение

Я воспроизвел проблему, поразив сервер с:

curl -H 'Accept-Encoding: gzip,deflate' --compressed -v http://foo/bar

HHVM включает сжатие по умолчанию. Отключение вернуло мне заголовок.

Все было здорово после добавления этого /etc/hhvm/server.ini

hhvm.server.gzip_compression_level = 0
1

Другие решения

Я наткнулся на эту проблему / функцию. Не работает HHVM, хотя. Чистый nginx + PHP-FPM.
Дело в том, что если ваше PHP-приложение вычисляет и задает поле заголовка Content-Lenght, а ваш nginx настроен на gzip-контент, он просто отбросит эту информацию и заменит ее кодированием передачи Chunked и заголовками GZIP.
Поэтому не устанавливайте в GZIP очень маленькие буферы, по умолчанию используется 20 байтов, что делает обратное (конечный результат больше, чем до сжатия GZIP).
Я установил это так:
gzip_min_length 1024;

0

По вопросам рекламы [email protected]