Узнать размер строки в байтах

becool

Новичок
Узнать размер строки в байтах

Извеняюсь, если вопрос глупый но всё же =)
как узнать размер в байтах файла который я сгенерировал в php (xml), но ещё не вывел (echo $xml;).
strlen() показывает практически точно, но не совсем. Заголовки ведь тоже размер свой имеют.
Вобщем вот.
 

becool

Новичок
Сгенерированного xml файла который будет выведен через echo, и загружен сторонним приложением.
 

Андрейка

Senior pomidor developer
и откуда у файла появились заголовки? как они выглядят? нафик тебе их считать?
 

becool

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

becool

Новичок
а иначе при загрузке этого файла, моя гениальная клиентская программа, считает что размер у него равен нулю. И меняет своё мнение лишь после окончания загрузки. Меня это ну очень расстраивает. Ввергает так скыть в уныние. Без информации о размере загружаемого файла, жизнь становится не такой яркой, как могла бы быть.
 

Андрейка

Senior pomidor developer
чини гениальную программу
ЗЫ. так причем тут размер заголовков то и "неправильная" работа strlen?
 

becool

Новичок
ну как же! Вопервых я вообще не знаю ни одного приложения, которое брало бы информацию о файле, его типе, размере на сервере не из заголовков. А во вторых этот самый strlen() считает кол-во символов, вот у меня 71496, в то время как размер загруженного файла в байтах равняется - 71531. Понятное дело - разница не велика. Но онаж есть! К тому же не всегда одинаковая.
 

Андрейка

Senior pomidor developer
becool
дык а почему ты считаешь, что глючит именно strlen а не прога? прога точно умеет читать chunked ответ без указания размера?
strlen($r = str_repeat('X',71496)); echo $r; чему размер будет равен в скрипте и размер файла?
 

dimagolov

Новичок
becool, мне вот интересно. ну выясниться какой размер у документа с хедерами вместе. и что с этим числом предполагается делать?
 

Zetruger

ivan.chistyakov.name
becool
нафига тебе размер заголовку - это никому не интересно
content-length содержит только размер контента (без заголовка)
 

Z-Ghost

Новичок
ну теоретически узнать размер заголовка можно через функую apache_response_headers() + учет дополнительных символов (первая строка ответа, : между переменной и значением каждого элемента массива, перевод строки после каждой пары переменная-значение + двойной перевод в конце заголовка).

Только вот в самом определении HTTP (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13) указано что в Content-Length указывает размер тела (без заголовка)...

The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.
 

becool

Новичок
dimagolov подставить это число в content-length и радоваться точной информации при загрузке, плюс возможность эту загрузку должным образом обработать.


Андрейка дружище, ничо не глючит, просто информация ээм.. не полная в strlen().


Zetruger, Z-Ghost пожалуй всё верно, одно маленькое НО. Допустим я беру сторонний файл с диска (любой), открываю его через file_get_contetns(); узнаю его размер через filesize, и о чудо! размер точен и в php и на стороне клиента, плюс ко всему этому добавляю свои заголовки, которые, как вы верно заметили, не влияют на размер контента. (вот тока-тока проверил)
А сгенерированный контент информацию о размере своём нагло занижает. Может есть какие то символы, которые strlen просто не считает? какенить там.. eof и т.п.? или что то добавляется при выводе на печать (echo)?...

На текущий момент, тупо добавляю недостающее кол-во байт к размеру. пока работает. Хотелось бы разобраться по програмистски с этой проблемкой и закрыть её для себя... =)

-~{}~ 20.07.07 13:09:

нет нихрена подобного, чем больше файл, тем больше погрешность. АААА!!!!

-~{}~ 20.07.07 13:17:
вот потестил немнога: (первый это strlen(), второй это полученное кол-во байтов клиентом, третье это разница)

// 141 - 144 (3)
// 71496 - 71501 (5)
// 142851 - 142851 (0)
// 428271 - 428277 (6)
 

FlexIDK

Новичок
мне тоже интересно! хочу выдавать странички с известной датаой создания, и размером, и т.д.
 

Z-Ghost

Новичок
а сгенерированный файлик случаем не в UTF? потому что если так то strlen действительно может не правильно определять размер строки - может пригодиться в таком случае вот такая вот функция: http://ru2.php.net/manual/ru/function.strlen.php#72274
 

AmdY

Пью пиво
Команда форума
не совсем вьехал в проблемму, но подозреваю что у человека проблема с юникодом и функцией strlen. попробуй mb_strlen
----
опоздал
 

Zetruger

ivan.chistyakov.name
не совсем вьехал в проблемму, но подозреваю что у человека проблема с юникодом и функцией strlen. попробуй mb_strlen
стоп-стоп-стоп

человек использует функ. strlen для того чтобы подставить число в заголовок Content-Length

strlen возвр. количество байт в блоке памяти
(а так как блок памяти явл. строкой, то по совместительству она возвращает ее длину)

в случае с ЮНИКОДОМ
strlen также возвр. количество байт в блоке памяти - ЧТО ТАМ И НУЖНО!!!
(только на этот раз это число не будет совпадать с количеством символов в строке, но оно нам и не нужно)

Content-Length это имнно количество байт (по умолчанию), а не количество символов (которых действительно может оказаться меньше)

вывод файла

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="downloaded.pdf"');
header('Content-Length: ' . filesize('original.pdf'));

readfile('original.pdf');


вывод текста

ob_start();


echo ...
echo ...
echo ...

header('Content-Length: ' . ob_get_length());
echo ob_get_clean();
 

becool

Новичок
Z-Ghost в utf, но нужно не символы а байты =)

Zetruger спасиба! вот не пользовался такой шикарной штукенцией. - работает как надыть =)
 
Сверху