Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于32位系统上大于2-4GB的文件的PHP中fseek()的替代方法_Php_Linux_32 Bit_Seek_Fseek - Fatal编程技术网

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

用于32位系统上大于2-4GB的文件的PHP中fseek()的替代方法,php,linux,32-bit,seek,fseek,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));' .

我需要在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脚本…

这有帮助吗@RiggsFolly:不幸的是没有-该项目只使用了一系列不同的技术来获取文件大小-例如,它可以使用libcurl对
文件://
路径执行仅头请求,然后从
内容长度
字段(是)。如果你问我的话,这是相当巧妙的;我只是感到失望的是,在只有一次机会做到这一点的那一天,PHP设计得如此糟糕。好吧,我想我最终会使用一个shell脚本,因为我已经准备使用
xz
实用程序(PHP唯一的xz库已经有4年历史了,没有维护,segfults太容易了,我不喜欢,不提供低级控制,只对文件有效)来进行流压缩。对于其他需要解决此问题的人,如果执行
文件://
请求并设置范围标头,libcurl可能会起作用。未经测试,告诉我是否有效!(在键入上述注释时就想到了这一点)。