[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не корректная запись данных в файл
Страницы: 1, 2
Kuliev
Доброго времени суток.

Есть массив, который перебираю в цикле и конкантенирую все в переменную в виде строки.
Далее эту переменную с готовым текстом записываю в файл.
 
<?php
file_put_contents($file, $text, LOCK_EX);
?>


Если переменную $text просто распечатывать на экран, то все супер. Но когда открываю файл, то получается вот такая картина.

первая строка пустая, далее идет пробел от начала первой строки, и потом в конце обрезаются около 3 - 4 символов.

Может кто в курсе такого поведения file_put_contents()?

Пример файла

-------------------------- //пустая строка
--текст1;текст2;текст3
текст1;текст2;текст3
текст1;текст2;текст3
текст1;текст2;текст3
текст1;текст2;текст3
текст1;текст2;текст3
текст1;текст2;тек

Примерно так.
killer8080
подозреваю что file_put_contents тут не причём, что то происходит с данными перед записью в файл.
Kuliev
Цитата (killer8080 @ 12.03.2018 - 18:25)
подозреваю что file_put_contents тут не причём, что то происходит с данными перед записью в файл.

С этим я согласен, но не пойму в какой момент происходит изменения. Если просто вывожу на экран, то все ОК, если в файл то вот такая беда.

Знатоки посоветуйте куда можно капнуть...
killer8080
var_dump() сразу перед file_put_contents, потом прочитать файл обратно и сравнить по количеству символов и содержимому, может там какойнить нул байт затесался хз
Invis1ble
Пошаговый дебаггинг, чего тут сложного. xdebug или тупой var_dump

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

sergeiss
Цитата (Kuliev @ 12.03.2018 - 16:35)
Если переменную $text просто распечатывать на экран, то все супер.

Ну так и правильно - при простом выводе на странице все пробелы, переводы строк и т.д. (идущие подряд) выводятся как один пробел.

Используй тэг <pre>тут твой текст</pre>, тогда всё будет выведено целиком.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Kuliev
Цитата (Invis1ble @ 12.03.2018 - 21:30)
Пошаговый дебаггинг, чего тут сложного. xdebug или тупой var_dump


<?php var_dump($text); exit; ?>


Результат
string(88821) *** много текста

При этом все данные на месте.
Kuliev
Цитата (sergeiss @ 12.03.2018 - 22:58)
Цитата (Kuliev @ 12.03.2018 - 16:35)
Если переменную $text просто распечатывать на экран, то все супер.

Ну так и правильно - при простом выводе на странице все пробелы, переводы строк и т.д. (идущие подряд) выводятся как один пробел.

Используй тэг <pre>тут твой текст</pre>, тогда всё будет выведено целиком.

PRE тоже выводит текст как надо, но пишет его не так как ожидаю.
Kuliev
Вот что у меня при записи в файл получается.

user posted image

user posted image
Kuliev
Вот так выводится перед записью

user posted image
Kuliev
В общем нашел где собака зарыта....

Дело в том, что файл после генерации и записи нужно отдать на скачку пользователю и вот в этот момент происходит изменения. Сам файл корректно записывается.

Использую функцию:


<?php
function
file_force_download($file)
{
if (file_exists($file))
{
// сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
// если этого не сделать файл будет читаться в память полностью!

if (ob_get_level())
{
ob_end_clean();
}

// заставляем браузер показать окно сохранения файла
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
// читаем файл и отправляем его пользователю
readfile($file);
}
}

?>


Так как использую буферизацию приходится ее чистить перед отправкой.

<?php
if (ob_get_level())
{
ob_end_clean();
}
?>


Как можно заставить его нормально отдавать файл?
AllesKlar
Цитата (Kuliev @ 13.03.2018 - 08:36)
// сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
  // если этого не сделать файл будет читаться в память полностью!

Чтобы этого не было, нужно отдавать файл кусками с заголовками Range
https://habrahabr.ru/post/138504/



_____________
[продано копирайтерам]
Kuliev
Цитата (AllesKlar @ 13.03.2018 - 13:14)
Цитата (Kuliev @ 13.03.2018 - 08:36)
// сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
   // если этого не сделать файл будет читаться в память полностью!

Чтобы этого не было, нужно отдавать файл кусками с заголовками Range
https://habrahabr.ru/post/138504/

Проблема в буфере ob_start();

if (ob_get_level())
//Как-то криво чистит буфер, что часть поподает в начало файла
//И часть в конце файла

ob_end_clean();


Пока не победил (
kaww
Где-то пробелы в начале файлов перед <?php и/или нужно убедиться, что все файлы сохранены в utf8 без bom, разумеется, если они в utf8
Kuliev
Цитата (kaww @ 13.03.2018 - 15:10)
Где-то пробелы в начале файлов перед <?php и/или нужно убедиться, что все файлы сохранены в utf8 без bom, разумеется, если они в utf8

Файлы без BOM все в UTF-8
В общем решил на время свою проблему с помощью AJAX
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.