jkuchar/bigfiletools

允许您在PHP中操作超过2GB的文件的工具。

v2.0.0 2016-03-17 16:18 UTC

README

Join the chat at https://gitter.im/jkuchar/BigFileTools Latest Stable Version License Total Downloads Monthly Downloads Build Status - Linux Build status - Windows Scrutinizer Code Quality Code Climate API 文档

本项目收集了在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扩展,它可以使您使用最快的驱动程序。