скорее всего чистое любопытство, но периодически встречается что-то типа "пытался вывести 650-метровый файл с помощью readfile, скрипт виснет", поэтому хотелось бы знать, когда readfile можно использовать, а когда нет.
Идем в файл /main/php_streams.h и находим там строку: #define php_stream_passthru(stream) _php_stream_passthru((stream) STREAMS_CC TSRMLS_CC)
Открываем файл /main/streams.c и находим функцию PHPAPI size_t _php_stream_passthru(php_stream * stream STREAMS_DC TSRMLS_DC)
И в ней видим, что если подключена библиотека MMAP и stream связан с локальным файлом, то происходит копирование всего файла в ОЗУ (строчка p = mmap(0, len, PROT_READ, MAP_SHARED, fd, off);)
А если этой библиотеки нет или stream связан не с локальным файлом, то выполняется цикл: