Подтвердить что ты не робот

Случайно появляющиеся заголовки gzip

У меня долгое время script в среде совместного размещения, которая выводит кучу XML

Иногда (только иногда) на моем выходе появляется случайный заголовок GZIP, и выход будет завершен.

Например

0000000: 3c44 4553 435f 4c4f 4e47 3e3c 215b 4344  <DESC_LONG><![CD
0000010: 4154 415b 1fc2 8b08 0000 0000 0000 03c3  ATA[............
0000020: b3c3 8b57 c388 c38c 2b28 2d51 48c3 8bc3  ...W....+(-QH...
0000030: 8c49 5528 2e48 4dc3 8e4c c38b 4c4d c391  .IU(.HM..L..LM..
0000040: c3a3 0200 c291 4464 c383 1900 0000 0d0a  ......Dd........

или

0000000: 3c2f 5052 4f44 5543 543e 0d0a 1fc2 8b08  </PRODUCT>......
0000010: 0000 0000 0000 03c3 b3c3 8b57 c388 c38c  ...........W....
0000020: 2b28 2d51 48c3 8bc3 8c49 5528 2e48 4dc3  +(-QH....IU(.HM.
0000030: 8e4c c38b 4c4d c391 c3a3 0200 c291 4464  .L..LM........Dd
0000040: c383 1900 0000 0d0a                      ........

или

0000000: 3c4d 4544 4941 5f55 524c 3e2f 696d 6167  <MEDIA_URL>/imag
0000010: 6573 2f69 6d70 6f72 7465 642f 7374 6f63  es/imported/stoc
0000020: 6b5f 7072 6f64 3235 3339 365f 696d 6167  k_prod25396_imag
0000030: 655f 3531 3737 3439 3436 302e 6a70 673c  e_517749460.jpg<
0000040: 2f4d 4544 4941 5f55 1fc2 8b08 0000 0000  /MEDIA_U........
0000050: 0000 03c3 b3c3 8b57 c388 c38c 2b28 2d51  .......W....+(-Q
0000060: 48c3 8bc3 8c49 5528 2e48 4dc3 8e4c c38b  H....IU(.HM..L..
0000070: 4c4d c391 c3a3 0200 c291 4464 c383 1900  LM........Dd....
0000080: 0000 0d0a                                ....

Переключение на GZIP, похоже, не попадает ни в какое конкретное время, а может быть после 1 МБ данных или после 15 МБ

Скомпилированный шаблон лезвия в соответствующих строках выглядит следующим образом

<DESC_LONG><![CDATA[<?php echo $product->display_name; ?>]]></DESC_LONG>

-

</PRICES>
</PRODUCT>
<?php foreach($product->models()->get() as $model): ?>

-

<MEDIA_URL>/images/imported/<?php echo $picture->local_name; ?></MEDIA_URL>

Я нахожусь на своем пути, я пробовал следующее:

  • Отключить gzip на сервере.
  • Запустите while(ob_get_level()){ ob_end_clean(); } перед запуском script
  • В .htaccess я пробовал SetEnv no-gzip 1, SetEnv no-gzip dont-vary и различные его перестановки.

Когда я посещаю другие страницы, не появляются кодировки или заголовки gzip, поэтому я думаю, что это что-то с выходным размером или выходным буфером.

4b9b3361

Ответ 1

Вы наконец выяснили, откуда взялись эти заголовки? Я имею в виду apache или php?

Вы можете имитировать скрипт генератора xml с чем-то вроде:

echo file_get_contents('your_good_test.xml');

Если вы не увидите заголовков, я предлагаю отладить ваш генератор xml. Вы можете попробовать вызвать header_remove(); перед выходом.

Если вы видите заголовки, вам нужно отладить ваш веб-сервер. Попробуйте отключить gzip в apache с помощью правила перезаписи:

`RewriteRule . - [E=no-gzip:1]`

Всякий раз, когда у вас есть какой-либо прокси или балансир (nginx, squid, haproxy), вы автоматически получаете еще одну линию стрельбы.

Ответ 2

ваш gziping не связан с выходом сервера, который возвращает ваш основной объект xml. В противном случае весь xml будет сжат.

Эти методы возвращают GZIP иногда из-за того, что источник, где они берут элементы, настроен на поддержку gzip и не задан должным образом.

$product->display_name
$product->models()->get()
$picture->local_name

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

Добавьте теги CDATA для всех мест, где двоичные данные могут быть возвращены, чтобы избежать завершения основного здания в корпусе xml. Подождите, пока xml с данными bin, сохраните данные bin, распакуйте его и посмотрите, что внутри.: -)

Ответ 3

Это больше набор комментариев, но он слишком длинный для поля комментариев.

Во-первых, это скорее всего НЕ проблема с выходным буфером. Хотя <![CDATA[ и ]]> не входят в теги PHP, это не означает, что он не проходит через буфер вывода PHP. Чтобы быть ясным, все, что находится внутри .php файла, будет помещено в выходной буфер PHP. Содержимое в файле .php(включая статическое содержимое) буферизуется вне Apache и затем передается обратно в Apache через этот буфер, когда завершается script. Это означает, что ваша проблема должна лежать внутри самого кода, который является выстрелом в темноте, чтобы решить, не просматривая код.

Мои предложения:

1) выполните поиск в script, чтобы найти любые примеры функций gz (gzcompress, gzdeflate, gzdecode и т.д.). Я видел, как скрипты сжимают содержимое, если оно больше определенного размера, а затем распаковывает содержимое "на лету", когда оно берется из БД. Если это так, вы, вероятно, имеете дело с неисправной операцией сравнения. Короче говоря, логика в условиях сжатия и декомпрессии слегка отключена, поэтому она не может распаковать НЕКОТОРЫЕ из содержимого.

2) выполните поиск в script, чтобы узнать, как извлекаются эти данные. Все ли из базы данных? Есть ли это из потока? Любой из них удален удаленно? Эти вопросы не могут напрямую привести к ответу, но жизненно важны. Можно смело предположить, что эти переменные устанавливаются с уже сжатыми данными, когда это не должно быть. Это требует знания того, где/почему/как происходит сжатие, чтобы ответить, почему он не распаковывается.

3) Очень важно, что он работает, как ожидалось, в одной системе, но не в другом. Единственный раз, когда я видел это, всегда было связано с различиями в конфигурации. Какая операционная система использовалась вашей локальной машиной? Какая разница в локальной базе данных (если таковая имеется), какие расширения могут отсутствовать/присутствовать на одном или другом, что может привести к тому, что функция будет отбрасываться на другую процедуру на двух разных машинах.

EDIT: Кроме того, и это небольшой шанс, но вы имеете дело с данными, которые возникли из дампа SQL с другого сервера? Вы сказали, что он работает на вашем локальном хосте, но не на другом хосте, поэтому мы знаем, что вы имеете дело с двумя машинами. Был ли какой-то третий момент? Если это так, возможно, он был сжат с использованием несогласованной версии/формы сжатия или может быть проблемой с кодировкой.