Как отправить данные в PHP без длины контента? - PullRequest
4 голосов
/ 16 марта 2009

Я знаю, что это возможно, но я не могу понять это.

У меня есть запрос mySQL, у которого есть пара сотен тысяч результатов. Я хочу иметь возможность отправлять результаты, но, похоже, для ответа требуется заголовок длины содержимого, чтобы начать загрузку.

В phpMyAdmin, если вы собираетесь экспортировать базу данных, она сразу начинает загрузку, FF просто сообщает неизвестный размер файла, но это работает. Я посмотрел на этот код, но не смог понять.

Помощь

Спасибо.

Ответы [ 6 ]

10 голосов
/ 16 марта 2009

этот документ в разделе 14.14 гласит, что В HTTP СЛЕДУЕТ отправлять всякий раз, когда длина сообщения может быть определена до его передачи, если это не запрещено правилами в разделе 4.4 . Это означает, что отправлять сообщение НЕ нужно, если вы не можете сказать его размер.

Только не отправляйте.

Если вы хотите отправить части данных в браузер до того, как все данные станут доступны, вы очищаете свой выходной буфер? Может в этом и проблема, а не отсутствие заголовка?

То, как вы используете флеш, выглядит так:

  • генерирует некоторый вывод, который должен добавить его в буфер
  • flush () it, который должен отправить текущий буфер клиенту
  • Перейти к 1

Итак, если ваш запрос возвращает много результатов, вы можете просто сгенерировать вывод, скажем, для 100 или 1000 из них, затем очистить и т. Д.

Кроме того, чтобы сообщить браузеру клиента о попытке сохранить файл вместо его отображения в окне, вы также можете попробовать использовать заголовок Content-disposition: attachment . См. спецификацию здесь, раздел 19.5.1.

2 голосов
/ 16 марта 2009

Вы можете использовать chunked Transfer-Encoding. По сути, вы отправляете заголовок «Transfer-encoding: chunked», а затем данные отправляются в чанкованном режиме, что означает, что вы отправляете длину чанка, а затем чанка. Вы продолжаете повторять это до конца данных, после чего отправляете кусок нулевой длины.

Подробности в RFC 2616 .

1 голос
/ 16 марта 2009

Возможно, вы используете gzip, который ожидает создания всего контента. Проверьте ваш .htaccess на наличие директив относительно этого.

0 голосов
/ 16 марта 2009

Длина содержимого http - ОБЯЗАТЕЛЬНО, поэтому вы можете оставить его ... но вы должны установить кодировку передачи тогда взгляните на Почему "Content-Length: 0" в запросах POST?

0 голосов
/ 16 марта 2009

Если вы используете плагин LiveHTTPHeaders в FireFox, вы можете увидеть разницу между заголовками, отправляемыми phpMyAdmin, и заголовками, отправляемыми вашим приложением. Я не знаю, что конкретно тебе не хватает, но это должно дать тебе подсказку. Один быстрый заголовок, который я вижу при выполнении быстрого теста, - «Transfer-Encoding: chunked», и я также вижу, что они не отправляют контент-длину. Вот ссылка на плагин FireFox, если у вас его еще нет: LiveHTTPHeaders

0 голосов
/ 16 марта 2009

Вам не нужно устанавливать поле заголовка Content-Length. Это поле заголовка просто для того, чтобы сообщить клиенту количество данных, которое он ожидал. Фактически, «неправильное» значение может привести к тому, что клиент отбрасывает некоторые данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...