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


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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
23 апр. 2024, в 13:19
15000 руб./за проект
23 апр. 2024, в 13:17
2000 руб./за проект