根据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
。
答案 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源。
看起来输入流没有被标记为无缓冲,所以在PHP 5.2上它似乎也至少读取了它的最小缓冲区大小。