使用file_get_contents读取/dev/urandom报错stream does not support seeking的原因
file_get_contents() 报错 "stream does not support seeking" 的根本原因
核心原因
/dev/urandom 是字符设备流,并非普通可随机访问的文件。这类流的特性是数据实时生成、无固定文件大小,完全不支持「定位(seek)」操作——也就是说你无法指定从某个偏移位置读取数据,因为它根本没有可定位的文件指针位置。
你代码中使用了file_get_contents的第4个参数(offset,偏移量),只要指定这个参数,PHP就会尝试对目标流执行seek操作。但/dev/urandom不支持该操作,所以直接抛出错误。哪怕把偏移量改成1也没用,因为只要指定offset参数,就会触发seek动作,而这个流本身不支持seek。
修复后的代码
要读取固定长度的随机数据,只需保留maxlen参数,去掉offset参数的指定即可:
public function getRandomStr() { return bin2hex(file_get_contents('/dev/urandom', 0, null, null, 16)); }
或者更简洁的写法,省略不必要的参数:
public function getRandomStr() { return bin2hex(file_get_contents('/dev/urandom', false, null, 0, 16)); }
当offset设为null(或不传递该参数)时,PHP不会执行seek操作,直接从流的当前位置读取16字节数据,刚好满足生成32字符随机串的需求。
跨平台替代方案
如果是在Windows环境下,/dev/urandom不存在,推荐使用PHP 7+提供的random_bytes()函数,它是跨平台的安全随机数生成工具,用法更简单:
public function getRandomStr() { return bin2hex(random_bytes(16)); }
内容的提问来源于stack exchange,提问作者phperson
相关产品推荐
相关产品推荐

