Pull to refresh

Копирование из потока — сравнение различных способов

Reading time 1 min
Views 2.3K
Возникла задача из php://input скопировать данные в нужный файл.
Решил проверить на быстродействие возможные способы копирования файла размером 9 мегабайт из php://stdin.
Их несколько:
  • Чтение блоками через fread() и запись через fwrite()
  • Запись содержимого используя file_put_contents() данных, полученных с помощью file_get_contents()
  • Копирование с использованием функции копирования файлов copy()
  • Использование stream_copy_to_stream(). появилась в PHP5
Результаты fread/fwrite:
Затрачено памяти: 9440 байт.
Затрачено времени: 0,09 секунд.

Результаты file_get_contents/file_put_contents:
Затрачено памяти: 940 байт.
Затрачено времени: 0,06 сек;

Результаты copy():
Затрачено памяти: 1008 байт.
Затрачено времени: 0,05 сек;

Результаты stream_copy_to_stream:
Затрачено памяти: 1240 байт.
Затрачено времени: 0,04 сек;

Что самое интересное stream_copy_to_stream оказалась быстрее copy(). Если же брать обычный файл, НЕ поток, то результаты скорее всего будут в пользу copy()

UPD: phpclub.ru/paste/index.php?show=1993 — код теста

UPD 2: Протестил на файле в 240Мб. В выигрыше все, кроме fread/fwrite (приблизительно 30 секунд против 60).
Так что на больших файлах не рекомендуется пользовать его и file_get_contents из-за того что нужны соответствующие значения memory_limit в php.ini.

В итоге сделал на stream_copy_to_stream.
Tags:
Hubs:
+17
Comments 14
Comments Comments 14

Articles