Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Отдача файлов скриптом и напрямую


Автор: Greendrake 19.7.2006, 17:59
В корне сервера имеем файл 1.txt со всякой лабудой на несколько десятков кило.
Также имеем файл 1.php следующего содержания:
Код

<?
header('Content-Type: text/plain; charset=windows-1251');
echo file_get_contents("1.txt");
;?>


Вопрос: в чём будет заключаться отличие в ответах сервера при запросе 1.txt и 1.php ?

В браузере отличий, понятное дело, нет, однако их чувствует программа 1С. В случае 1.php она обрезает (или недополучает) ответ, получив около 1 кб smile.  

Автор: PARROT 19.7.2006, 18:24
Код

$php = file_get_contents('1.php'); 

$fp = fopen('1.txt', 'a'); 
fput($fp, $php); 
fclose($fp); 


В вашем коде лишняя ;  

Автор: Greendrake 19.7.2006, 20:27
PARROT, не понял к чему приведённый вами код. Он заносит содержимое 1.php в конец 1.txt - как это относится к сабжу? 

Автор: PARROT 19.7.2006, 21:01
Цитата(Greendrake @  19.7.2006,  18:59 Найти цитируемый пост)
Вопрос: в чём будет заключаться отличие в ответах сервера при запросе 1.txt и 1.php ?

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

 

Автор: Greendrake 19.7.2006, 21:50
Цитата(PARROT @ 19.7.2006,  21:01)
Просто не совсем понятно, что вы хотите получить в итоге, результат работы скрипта или что-то иное.

Я просто хочу чтобы скрипт тупо прочитал и выдал содержимое txt-файла.
Но на этом мои желания не заканчиваются.
Ещё я хочу, чтобы клиент не мог догадаться, что ему подсунул сервер - собственно текстовый файл, или его же содержимое, выданное скриптом.

Предыстория вопроса:
Обнаружено, что программа 1С при при обращениях к сайтам в одних случаях получает страницы полностью, а в других - обрезанные. При этом браузеры получают страницы целиком всегда.
С целью докопаться до причин, был поставлен следственный эксперимент, о котором здесь и идёт речь. Программа 1С получает содержимое файла txt при его прямом запросе - целиком и полностью, а при запросе скрипта - не полностью. Хотя браузеры выдают идентичное содержимое при запросе и того и другого.

Кстати, на различия в URLах - .php или .txt на конце можно не грешить, это я уже проверял с помощью mod_rewrite, подсунув скрипт по запросу txt. Результат не отличался от запроса php, т. е. был обрезанным в 1C.

Походу, тут ничего не остаётся кроме как побайтно сверять ответ сервера со всеми заголовками в обоих случаях - txt и php.
Вот ответы, которые удалось подсмотреть с помощью анализатора трафика:

Ответ на запрос текстового файла

user posted image

Ответ на запрос скрипта, тупо выдающего содержимое текстового файла

user posted image

Что бросается в глаза?
Во-первых, у ответа на запрос txt указана длина - Content-Length. Во вторых, ответ на запос скрипта выдан в неком chunked формате - что это такое и как с этим бороться?

Короче, теперь вопрос стоит так:
Как нужно изменить php-скрипт, чтобы его ответ был таким же как у txt?

Добавлено @ 22:03 
Короче, я так подозреваю, нужно просто ставить заголовок Content-Length с длиной файла. Вот тут у чувака похожая трабла была http://ru.php.net/header#50948
Заврта попробую. 

Автор: szz 20.7.2006, 05:45
Цитата
выдан в неком chunked формате - что это такое и как с этим бороться?

   Это как бы законсервированный способ передачи. Файл выдается по кусочкам (размер текущего кусочка указан в хедере Chunk size: xxx octets). Браузер после получения этого кусочка должен запросить новый и так до конца - это делается чтоб юзер видел постепенно загружающийся файл, а не ждал пока все-все подгрузится, а потом отобразится (или для долгоиграющих файлов, вроде видео или аудио потоков)
   Бороться с этим так: 
 поставить длину (верно мыслишь) и 
Код

header('Transfer-encoding: 7bit'); // не уверен можно ли ставить 8bit, так как я это делал только с western текстами, но ты попробуй.

  У меня MDM Zinc тоже грузил только первый чанк - поставив 7bit и длину - я все исправил.  

Автор: Greendrake 20.7.2006, 08:45
Всё, вот рабочее решение

Код

<?

$file="1.txt";
header('Content-Length: '.filesize($file));
header('Content-Type: text/plain; charset=windows-1251');
echo file_get_contents($file);

?>
 

Автор: szz 20.7.2006, 15:33
Что-ж, значит 1C поумнее Zinca будет ))) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)