Чтение очень больших файлов в PHP

fopen терпит неудачу, когда я пытаюсь прочитать файл с очень умеренным размером в PHP . A 6 meg file заставляет его задыхаться, хотя небольшие файлы размером около 100k Просто хороши. Я читал, что иногда необходимо перекомпилировать PHP с -D_FILE_OFFSET_BITS=64 , чтобы читать файлы более чем на 20 концертах или что-то нелепое, но разве у меня нет проблем с 6-мегабайтным файлом? В конце концов, мы захотим прочитать файлы размером около 100 мегабайт, и было бы неплохо открыть их, а затем прочитать их по строкам с помощью fgets, поскольку я могу делать с меньшими файлами.

Каковы ваши трюки / решения для чтения и выполнения операций с очень большими файлами в PHP ?

Обновление: вот пример простого кодового блока, который не работает в моем 6-мегабайтном файле – PHP, похоже, не выдает ошибку, он просто возвращает false. Может, я делаю что-то очень глупое?

 $rawfile = "mediumfile.csv"; if($file = fopen($rawfile, "r")){ fclose($file); } else { echo "fail!"; } 

Еще одно обновление: спасибо за вашу помощь, это оказалось чем-то невероятно глупым – проблема с разрешениями. У моего маленького файла необъяснимо были права на чтение, если в более крупном файле этого не было. Doh!

Вы уверены, что это неудачно, а не тайм-аут вашего скрипта? По умолчанию обычно около 30 секунд или около того, и если ваш файл занимает больше времени, чем для чтения, это может привести к его отключению.

Еще одна вещь, которую следует учитывать, может быть ограничением памяти на вашем скрипте – чтение файла в массив может обойти это, поэтому проверьте свой журнал ошибок на наличие предупреждений о памяти.

Если ни одна из вышеперечисленных проблем не является вашей проблемой, вы можете изучить использование fgets для чтения файла в строке за строкой, обрабатывая по мере поступления.

 $handle = fopen("/tmp/uploadfile.txt", "r") or die("Couldn't get handle"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle, 4096); // Process buffer here.. } fclose($handle); } 

редактировать

PHP, похоже, не вызывает ошибку, он просто возвращает false.

$rawfile ли путь к $rawfile относительно того, где работает скрипт? Возможно, попробуйте установить абсолютный путь здесь для имени файла.

Сделал 2 теста с файлом 1,3 ГБ и файлом 9.5GF

1,3

Использование fopen()

Этот процесс использовал 15555 мс для своих вычислений.

Он потратил 169 мс в системных вызовах

Использование file()

Этот процесс использовал 6983 мс для своих вычислений.

В системных вызовах он потратил 4469 мс

9.5GB

Использование fopen()

Этот процесс использовал 113559 мс для своих вычислений

Он потратил 2532 мс в системных вызовах

Использование file()

Этот процесс использовал 8221 мс для своих вычислений

Он провел 7998 мс в системных вызовах

Кажется, file() работает быстрее

Я использовал fopen для открытия видеофайлов для потоковой передачи, используя php-скрипт в качестве сервера потоковой передачи видео, и у меня не было проблем с файлами размером более 50/60 МБ.

Ну, вы можете попробовать использовать функцию readfile, если хотите просто вывести файл.

Если это не так – возможно, вам стоит подумать о дизайне приложения, почему вы хотите открыть такие большие файлы в веб-запросах?

для меня fopen () был очень медленным с файлами более 1mb, файл () работает намного быстрее. Просто пытаясь читать строки 100 за раз и создавать пакетные вставки, fopen () занимает 37 секунд, а файл () занимает 4 секунды. Должен быть, что string-> array step, встроенный в файл ()

Я бы попробовал все параметры обработки файлов, чтобы увидеть, какие из них будут лучше работать в вашем приложении.

Если проблема вызвана ударом ограничения памяти, вы можете попробовать установить более высокое значение (это может работать или не зависит от конфигурации php).

это устанавливает ограничение памяти до 12 Мб

 ini\_set("memory_limit","12M");