Как стать автором
Обновить

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

Время на прочтение1 мин
Количество просмотров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.
Теги:
Хабы:
Всего голосов 33: ↑25 и ↓8+17
Комментарии14

Публикации

Истории

Работа

PHP программист
150 вакансий

Ближайшие события