jkuchar / bigfiletools
允许您在PHP中操作超过2GB的文件的工具。
Requires
- php: >= 5.6.0
- brick/math: ~0.5.2
Requires (Dev)
- nette/tester: ^1.6
This package is auto-updated.
Last update: 2024-09-21 20:10:43 UTC
README
本项目收集了在PHP中操作超过2GB的文件所需的技巧(甚至在32位系统上)。目前支持获取 精确文件大小。这个项目始于对 Stack Overflow 问题 的回答。
最简单的用法
$file = BigFileTools\BigFileTools::createDefault()->getFile(__FILE__); echo "This file has " . $file->getSize() . " bytes\n";
将产生以下输出
This file has 176 bytes
请注意,getSize()
返回 Brick\BigInteger。这是因为PHP的内部整数可能对于大文件来说太小。
要获取文件大小的 近似值,可以将 BigInteger
转换为 float
。请注意,这样做您将 丢失精度。
提示:您可以根据需要配置BigFileTools。(不包含静态依赖)example目录中有一个示例。
这真的能行吗?
该项目在Linux、Mac OS X和Windows上自动测试。有关测试的更多信息,请参阅 测试目录。
内部原理
为了深入了解发生的事情,我们需要对数字在数字世界中的表示方式有一个简单的介绍。
问题在于PHP在大多数平台上使用32位有符号整数。PHPx64的Linux 64位版本使用64位,因此您在那里不再需要这个库。另一方面,64位Windows上的PHP 64位版本使用32位整数。由于PHP使用有符号整数,这意味着有一个位用于符号(+/-),其余用于值。
32-bit signed integer max value: +2^31 = 2 147 483 648 ~ 2 gigabytes
64-bit signed integer max value: +2^63 = 9 223 372 036 854 775 808 ~ 9 223 372 000 gigabytes
为了解决这个问题,这个库使用数字的字符串表示形式,这意味着您内存的RAM是数字大小的限制。
注意:有很多针对这个问题的非解决方案。其中大部分看起来像 sprintf("%u", filesize($file));
。这并不能解决问题。它只是稍微移动了问题。这里的 %u
假设给定的值是一个 无符号整数。这意味着第一个符号位也被视为一个值。不幸的是,这意味着边界只是从2GB限制移动到了4GB。
第二个问题是标准文件操作API会返回奇怪的错误或值。这就是为什么BigFileTools有 驱动程序
。它们默认按照从快到慢的顺序执行,不支持的驱动程序将被跳过。
驱动程序
目前支持 大小驱动程序 - 获取文件大小的驱动程序。
选择默认驱动程序及其顺序基于两个因素 - 可用性和速度。
在默认配置中,大小驱动程序按照速度排序,不可用的驱动程序将被跳过。这意味着在默认配置中,您无需担心兼容性问题。
要求
请遵循 Composer 的要求。
为了加快速度(例如,在生产环境中)我建议安装CURL扩展,它可以使您使用最快的驱动程序。