Задать вопрос

PHP — не считывается полный файл. Памяти и времени хватает?

Имеется скрипт, который прекрасно работал на локалхосте уже 2 года на разных версиях php — подгружает и парсит данные из csv файла. Собственно, файлы не такие уж и большие — максимальный — 22 Мб.

После очередной переустановки системы (win7 64bit ultimate на аналогичную home premium) и перенастройки веб-сервера (установка новых минорных версий апача, php и mysql) импорт вдруг не заладился — команды file, fgets, file_get_contents и прочие вдруг начали выдавать только кусок файла. Всё пляшет вокруг цифры примерно в 65 Кб, больше точно не считывает, иногда меньше.


В конфиге прописано memory_limit = 512M, max_execution_time = 1800


Полный конфиг пхп: pastebin.com/rTiRr53t

Полный конфиг апача: pastebin.com/uSmpP684


Файлы считываются примерно так:
$file_loc = 'pathtofile/file.dat';<br/>
$lines = file($file_loc);<br/>
<br/>
foreach ($lines as $line_num =&gt; $line)<br/>
 {<br/>
 echo $line;<br/>
 }<br/>



После очередного момента строка обрывается. Гугл отсылает к memory_limit и загрузке по частям с помощью разных ухищрений, но раньше-то работала и загрузка за один раз, благо файлы не огромные. Откат к предыдущей версии пхп не помог.


Что я упускаю?
  • Вопрос задан
  • 4599 просмотров
Подписаться 3 Оценить 2 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 10
webscout
@webscout
Проблема, мне кажется, не в конфигурации.

Посмотрите, правильный ли размер filesize($file_loc).

Если да, может попробовать постаринке?
$fh = fopen($file_loc, «rb»);
$data = fread($fh, filesize($file_loc));
fclose($fh);

Или вообще читать по частям?
while (!feof($fh))
$mytext = fgets($fh, 1024);
Ответ написан
eternals
@eternals
1. Функции конвертации кодировки используются? (Впрямую или косвенно).
2. Какая версия PHP до этого была?

Крайне желательно сам код получить или его фрагмент.
Ответ написан
@Naps
А попробуйте вместо file использовать file_get_contents
Ответ написан
Комментировать
@Dimonich
А вы тот php.ini правите? У пхп их несколько для разных вариантов запуска (apache, cli, FastCGI).
Ответ написан
Sannis
@Sannis
Вы с помощью «построчного» file() читали бинарные файлы? Очень интересно. И вправду, попробуйте file_get_contents().
Ответ написан
merlin-vrn
@merlin-vrn
Однажды долго бился над проблемой (всё правильно и ничего не работает), а потом проблема оказалась в suhosin patch.

Не может ли быть в этом дело?
Ответ написан
Комментировать
hayk
@hayk
А попробуйте сравнить рузультаты filesize($file_loc) и strlen(file_get_contents($file_loc)).
Размер прочитанных данных всегда один и тот же?
Может дело в самих данных?
Ответ написан
Комментировать
eternals
@eternals
> Теперь вопрос — что за чудеса и почему раньше работало с обоими видами путей?
Опять гадаем. Но почти наверняка дело в протоколе доступа к файлу. А как следствие — перекодировка. У PHP есть проблема с перекодировкой, особенно под windows. Ограничение в 64К результата перекодировки — это нормальная такая ситуация для PHP. Если копать глубже, то есть настройки перекодирования и выбор библиотеки перекодирования.
Ответ написан
Комментировать
SwampRunner
@SwampRunner
set_time_limit(0);?
Ответ написан
@resurection
Может это не то, но хоть идею подкину.

Было у меня что-то похожее при скачивании видео флешем. У меня тоже плесало вокруг 40кб. Выяснил, что если файл короче, то сервер посылает HTTP-заговловок Content-Length. А если длинее, то заголовка нет. Виновником был mod_deflate который жал отдаваемые файлы на лету. Если файл был меньше чем, кеш, то сервер сперва сжимал и мог показать правильный размер.
Попробуйте откатить Apache. Если поможет, то фаербагом досканально сравнивайте ответ.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽