替代PHP中的fseek(),用于32位系统上大于2-4GB的文件

时间:2017-06-04 13:46:34

标签: php linux 32-bit seek fseek

我需要寻找30GB-500GB之间的大文件。不幸的是,我需要在32位系统上执行此操作。

我刚刚用fseek()撞到了PHP的2GB限制,这是我在网上看不到的。

$ php -r 'var_dump(fseek(fopen("/dev/sda", "r"), 0, SEEK_END));'
int(-1)

因此系统调用正在返回-1。我想知道为什么:

$ strace php -r 'var_dump(fseek(fopen("/dev/sda", "r"), 0, SEEK_END));'
...
lstat64("/dev/sda", {st_mode=S_IFBLK|0660, st_rdev=makedev(8, 0), ...}) = 0
lstat64("/dev", {st_mode=S_IFDIR|0755, st_size=5460, ...}) = 0
open("/dev/sda", O_RDONLY)              = 3
fstat64(3, {st_mode=S_IFBLK|0660, st_rdev=makedev(8, 0), ...}) = 0
lseek(3, 0, SEEK_CUR)                   = 0
lseek(3, 0, SEEK_END)                   = -1 EOVERFLOW (Value too large for defined data type)

这发生在一个只有60GB大小的文件上。

所以我甚至无法寻求结束 - lseek()显然无法将文件指针表示回PHP。

另一方面,反复向前寻找SEEK_CUR似乎陷入4GB - 我无法移动文件指针超过该点。我需要寻找500GB文件的结尾。

我有什么选择?我目前的计划是使用dd(这是在Linux上),而我正在编写的工具也可能是一个shell脚本......

0 个答案:

没有答案