Возникла задача из php://input скопировать данные в нужный файл.
Решил проверить на быстродействие возможные способы копирования файла размером 9 мегабайт из php://stdin.
Их несколько:
Затрачено памяти: 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.
Решил проверить на быстродействие возможные способы копирования файла размером 9 мегабайт из php://stdin.
Их несколько:
- Чтение блоками через fread() и запись через fwrite()
- Запись содержимого используя file_put_contents() данных, полученных с помощью file_get_contents()
- Копирование с использованием функции копирования файлов copy()
- Использование stream_copy_to_stream(). появилась в PHP5
Затрачено памяти: 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.