как же всё-таки работает readfile ???

Winer

Мимо проходил
как же всё-таки работает readfile ???

как работает readfile:
1) считывает всё содержимое файла в память, а потом выводит его ???
или
2) считывает и тут же выводит содержимое файла ???
 

Demiurg

Guest
скорее всего второе.
а к чему такой вопрос ?
 

Winer

Мимо проходил
скорее всего чистое любопытство, но периодически встречается что-то типа "пытался вывести 650-метровый файл с помощью readfile, скрипт виснет", поэтому хотелось бы знать, когда readfile можно использовать, а когда нет.
 

ma2dy

Повернуть землю легко
int readfile ( string filename [, bool use_include_path [, resource context]])


Reads a file and writes it to the output buffer


читает файл и выдает его в выходной буфер


http://www.php.net/readfile
 

Winer

Мимо проходил
ma2dy
то есть он сначала считывает весь файл в массив строк, а потом выводит это массив???
 

Winer

Мимо проходил
да я знаю как работает readfile "в пхп", мне интересно как он работает "внутри".
 

ma2dy

Повернуть землю легко
2Winer

Скачай исходники и помотри как устроена функция readfile
 

Winer

Мимо проходил
смотрел, дошёл до функции php_stream_passthru и запутался, в Си я совсем не силён
 

valyala

Новичок
смотрел, дошёл до функции php_stream_passthru и запутался, в Си я совсем не силён
Идем в файл /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 связан не с локальным файлом, то выполняется цикл:
while ((b = php_stream_read(stream, buf, sizeof(buf))) > 0) {
PHPWRITE(buf, b);
bcount += b;
}
, т.е происходит последовательный вывод файла по 8192 байта (размер буфера buf)
 
Сверху