PHP';s fread()是否始终读取至少4096字节?

PHP';s fread()是否始终读取至少4096字节?,php,file,Php,File,根据Drupal 7的引导文件: // 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。这是真

根据Drupal 7的引导文件:

// 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/uradom
,而不必消耗不必要的熵。

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


4096字节长的缓冲区到底有什么问题?它太小了,不会以任何主要方式影响内存消耗,除非我在这里遗漏了什么。

如果您的文件小于4096字节,那么它会更小,或者我可以想象它会填充空值


4096字节长的缓冲区到底有什么问题?它太小了,不会以任何主要方式影响内存消耗,除非这里缺少一些东西。

这里有一个PHP函数-stream\u set\u read\u buffer():

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


因此,如果您想要更改默认行为,那么这个函数对于实验应该很有用

我在PHP中为您提供了一个函数-stream\u set\u read\u buffer():

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


因此,如果您想要更改默认行为,那么这个函数对于实验应该很有用

PHP<5.3的一个可能解决方法似乎是使用file\u get\u contents():

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


看起来输入流没有被标记为未缓冲,因此在PHP5.2上,这似乎也至少读取了它的最小缓冲区大小。

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

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


看起来输入流并没有被标记为未缓冲,因此在PHP5.2上,这似乎也至少读取了它的最小缓冲区大小。

出于您的目的,我认为4096字节很好-
/dev/uradom
将永远生成熵。如果你的程序需要4096字节(4KB),那么读取它需要几微秒,甚至更少,这意味着更多的熵可以取代它,并几乎立即被其他进程使用。我认为这不好。如果我需要16字节的伪随机数据,那么让熵源4096字节接近耗尽是没有意义的。你的想法有证据或实验吗?没有,对不起。然而,你确实提出了一个很好的观点。我认为您需要相当多的熵(例如2048字节),这是可以的,因为它是完整4096字节中更大的一个。你说4096字节对于16字节的通缉数据来说是多余的,这是非常正确的。Satya Prakash在下面的帖子中描述了一种玩弄东西的方式。出于你的目的,我认为4096字节很好-
/dev/uradom
将永远产生熵。如果你的程序需要4096字节(4KB),那么读取它需要几微秒,甚至更少,这意味着更多的熵可以取代它,并几乎立即被其他进程使用。我认为这不好。如果我需要16字节的伪随机数据,那么让熵源4096字节接近耗尽是没有意义的。你的想法有证据或实验吗?没有,对不起。然而,你确实提出了一个很好的观点。我认为您需要相当多的熵(例如2048字节),这是可以的,因为它是完整4096字节中更大的一个。你说4096字节对于16字节的通缉数据来说是多余的,这是非常正确的。Satya Prakash在下面的帖子中描述了一种玩弄东西的方式。不幸的是,它被缓冲了。我刚刚用一个用户空间流测试了它。不幸的是,它被缓冲了。我刚刚用一个用户空间流对它进行了测试。
int stream_set_read_buffer ( resource $stream , int $buffer )
$output = file_get_contents('/dev/urandom', FALSE, NULL, -1, $bytes);