PHP的fread()总是读取至少4096个字节吗?

时间:2010-11-28 13:21:23

标签: php file

根据Drupal 7的bootstrap文件:

// PHP only performs buffered reads, so in reality it will always read
// at least 4096 bytes. Thus, it costs nothing extra to read and store
// much so as to speed any additional invocations.

无论你是否为length参数指定了较低的值,PHP总是会读取4096。这是真的?如果是这样,是否真的没有办法进行无缓冲读取?

编辑:我想在不消耗熵的情况下阅读/dev/urandom

3 个答案:

答案 0 :(得分:3)

如果你有一个小于4096字节的文件,那么它会更少,或用我想象的空值填充。

无论如何,4096字节长的缓冲区有什么问题 - 它太小而不能以任何主要方式影响内存消耗,除非我在这里缺少一些东西。

答案 1 :(得分:1)

这里我在PHP中为你提供了一个函数 - stream_set_read_buffer():

int stream_set_read_buffer ( resource $stream , int $buffer )

buffer:要缓冲的字节数。如果buffer为0,则读取操作无缓冲。这可确保在允许其他进程写入该输出流之前完成所有fread()读取。

因此,如果您想更改默认行为,那么此功能应该对实验有用。

答案 2 :(得分:0)

PHP的可能解决方法< 5.3似乎是使用file_get_contents():

$output = file_get_contents('/dev/urandom', FALSE, NULL, -1, $bytes);

调用有点难看。但是,不知道如何确认它是无缓冲的,除了读取C源。

http://svn.php.net/viewvc/php/php-src/branches/PHP_5_2/ext/standard/file.c?revision=298881&view=markup

http://svn.php.net/viewvc/php/php-src/branches/PHP_5_2/main/streams/streams.c?revision=293175&view=markup

看起来输入流没有被标记为无缓冲,所以在PHP 5.2上它似乎也至少读取了它的最小缓冲区大小。