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

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 и загрузке по частям с помощью разных ухищрений, но раньше-то работала и загрузка за один раз, благо файлы не огромные. Откат к предыдущей версии пхп не помог.


Что я упускаю?
  • Вопрос задан
  • 4595 просмотров
Подписаться 3 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 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. Если поможет, то фаербагом досканально сравнивайте ответ.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы