:diskfreespace()(别名 disk_free_space())返回的是当前 PHP 进程在指定文件系统/分区上可用的字节数。返回值的单位是 字节(bytes),注意它通常表示“对运行进程可用”的空间,而不是磁盘上的绝对总空闲字节(在 Unix 上会受保留块和权限影响;在 32 位 PHP 上还可能遭遇整数溢出问题)。
下面把重要细节拆开解释并给出常见用法。
<span><span><span class="hljs-variable">$free</span></span><span> = </span><span><span class="hljs-title function_ invoke__">diskfreespace</span></span><span>(</span><span><span class="hljs-string">'/'</span></span><span>); </span><span><span class="hljs-comment">// 或者 disk_free_space('/path/to/dir');</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$free</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"获取失败"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"可用字节数: <span class="hljs-subst">$free</span></span></span><span>\n";
}
</span></span>
返回值单位:字节(bytes)。
可能的返回类型:在现代 PHP(64 位)上通常是整数(int,64-bit),在某些环境或较旧 PHP/32-bit 环境下可能是浮点数或出现溢出。函数在失败时返回 false 并发出警告(warning)。
参数:传入文件路径或挂载点(例如 C:\、/var、/mnt/share),不能直接传入 HTTP/FTP 等 URL(需要本地或已挂载的路径)。
diskfreespace() 的结果通常等同于系统调用(如 Unix 的 statvfs 或 Windows 等价)的“available”字段,这表示对**当前用户(或运行进程)**可用的字节数。因此:
在 Unix/Linux 上,文件系统通常为 root 保留一部分块(比如 5%),非 root 用户看不到这部分,返回值会 不包含 被保留的空间。
如果 PHP 以非特权用户运行,返回值反映的是该用户可写的空间,而不是超级用户可使用的全部空闲空间。
对网络挂载(NFS、SMB)或容器/虚拟机环境,返回数值也会受挂载选项和容器限制(quota、cgroups 等)影响。
因此 —— 若要判断磁盘是否“真正”空闲,需要结合权限、是否为 root、以及文件系统的保留/配额设置来理解数值。
disk_total_space() 返回该分区的总字节数(总容量),而 diskfreespace() 返回可用字节数。两者配合可以计算使用率:
<span><span><span class="hljs-variable">$path</span></span><span> = </span><span><span class="hljs-string">'/'</span></span><span>;
</span><span><span class="hljs-variable">$total</span></span><span> = </span><span><span class="hljs-title function_ invoke__">disk_total_space</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>);
</span><span><span class="hljs-variable">$free</span></span><span> = </span><span><span class="hljs-title function_ invoke__">diskfreespace</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$total</span></span><span> && </span><span><span class="hljs-variable">$free</span></span><span> !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-variable">$used</span></span><span> = </span><span><span class="hljs-variable">$total</span></span><span> - </span><span><span class="hljs-variable">$free</span></span><span>;
</span><span><span class="hljs-variable">$usedPercent</span></span><span> = </span><span><span class="hljs-variable">$total</span></span><span> > </span><span><span class="hljs-number">0</span></span><span> ? (</span><span><span class="hljs-variable">$used</span></span><span> / </span><span><span class="hljs-variable">$total</span></span><span>) * </span><span><span class="hljs-number">100</span></span><span> : </span><span><span class="hljs-number">0</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">printf</span></span><span>(</span><span><span class="hljs-string">"总容量: %s, 可用: %s, 已用: %.2f%%\n"</span></span><span>, </span><span><span class="hljs-title function_ invoke__">formatBytes</span></span><span>(</span><span><span class="hljs-variable">$total</span></span><span>), </span><span><span class="hljs-title function_ invoke__">formatBytes</span></span><span>(</span><span><span class="hljs-variable">$free</span></span><span>), </span><span><span class="hljs-variable">$usedPercent</span></span><span>);
}
</span></span>
磁盘空间常用两套单位定义:
二进制(常用于操作系统): 1 KiB = 1024 bytes, 1 MiB = 1024 KiB = 10242 bytes, 1 GiB = 10243 bytes。
十进制(一些厂商或硬盘规格): 1 KB = 1000 bytes, 1 MB = 10002 bytes。
PHP 返回字节数,若需“人类可读”的展示,通常按二进制(1024)转换更贴近操作系统工具(df -h 等通常显示 GiB):
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">formatBytes</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$bytes</span></span></span><span>, </span><span><span class="hljs-variable">$precision</span></span><span> = </span><span><span class="hljs-number">2</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">is_numeric</span></span><span>(</span><span><span class="hljs-variable">$bytes</span></span><span>) || </span><span><span class="hljs-variable">$bytes</span></span><span> < </span><span><span class="hljs-number">0</span></span><span>) </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">'0 B'</span></span><span>;
</span><span><span class="hljs-variable">$units</span></span><span> = [</span><span><span class="hljs-string">'B'</span></span><span>,</span><span><span class="hljs-string">'KiB'</span></span><span>,</span><span><span class="hljs-string">'MiB'</span></span><span>,</span><span><span class="hljs-string">'GiB'</span></span><span>,</span><span><span class="hljs-string">'TiB'</span></span><span>,</span><span><span class="hljs-string">'PiB'</span></span><span>];
</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>;
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$bytes</span></span><span> >= </span><span><span class="hljs-number">1024</span></span><span> && </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-title function_ invoke__">count</span></span><span>(</span><span><span class="hljs-variable">$units</span></span><span>)-</span><span><span class="hljs-number">1</span></span><span>) {
</span><span><span class="hljs-variable">$bytes</span></span><span> /= </span><span><span class="hljs-number">1024</span></span><span>;
</span><span><span class="hljs-variable">$i</span></span><span>++;
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">round</span></span><span>(</span><span><span class="hljs-variable">$bytes</span></span><span>, </span><span><span class="hljs-variable">$precision</span></span><span>) . </span><span><span class="hljs-string">' '</span></span><span> . </span><span><span class="hljs-variable">$units</span></span><span>[</span><span><span class="hljs-variable">$i</span></span><span>];
}
</span></span>
示例:1073741824 字节 = 1073741824 / 1024^3 = 1 GiB(即 1GiB)。
32 位溢出:在 32 位 PHP 上,较大的字节数可能超出 int 范围,导致错误或浮点近似。尽量在 64 位环境运行或用 float/字符串处理大数。
检查返回值:函数失败时返回 false,应用 === false 来判断错误,而不是 if (!$free)(因为 0 字节也是假值)。
权限和保留块:意识到返回的是“对当前进程可见/可用”的空间——如果你以 web 服务器用户运行,结果可能低于超级用户可用量。
网络文件系统(NFS/SMB):这些挂载可能返回不稳定或受挂载选项影响的值,应该结合具体挂载配置测试。
快速监控:若用于报警(如磁盘使用率 > 90%),请使用 disk_total_space() 和 diskfreespace() 的组合,并保守设置阈值以避免被保留块或配额误导。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$path</span></span><span> = </span><span><span class="hljs-string">'/'</span></span><span>; </span><span><span class="hljs-comment">// 要检测的路径</span></span><span>
</span><span><span class="hljs-variable">$total</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">disk_total_space</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>);
</span><span><span class="hljs-variable">$free</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">diskfreespace</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$total</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span> || </span><span><span class="hljs-variable">$free</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法获取磁盘信息(可能是路径错误或权限不足)\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>);
}
</span><span><span class="hljs-variable">$used</span></span><span> = </span><span><span class="hljs-variable">$total</span></span><span> - </span><span><span class="hljs-variable">$free</span></span><span>;
</span><span><span class="hljs-variable">$usedPercent</span></span><span> = </span><span><span class="hljs-variable">$total</span></span><span> > </span><span><span class="hljs-number">0</span></span><span> ? (</span><span><span class="hljs-variable">$used</span></span><span> / </span><span><span class="hljs-variable">$total</span></span><span>) * </span><span><span class="hljs-number">100</span></span><span> : </span><span><span class="hljs-number">0</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"路径: <span class="hljs-subst">$path</span></span></span><span>\n";
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"总容量: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">formatBytes</span></span><span>(</span><span><span class="hljs-variable">$total</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"可用: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">formatBytes</span></span><span>(</span><span><span class="hljs-variable">$free</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"已用: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">number_format</span></span><span>(</span><span><span class="hljs-variable">$usedPercent</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>) . </span><span><span class="hljs-string">"%\n"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$usedPercent</span></span><span> >= </span><span><span class="hljs-number">90</span></span><span>) {
</span><span><span class="hljs-comment">// 举例报警逻辑</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"警告:磁盘已使用超过 90%!\n"</span></span><span>;
}
</span><span><span class="hljs-comment">// formatBytes 函数同上</span></span><span>
</span></span>
diskfreespace() 返回字节数(bytes),代表当前 PHP 进程在该挂载点上可用的空间,而非一定等于磁盘上所有用户都能用的“绝对空闲量”。
结果受文件系统保留块、权限、配额、网络挂载和运行环境(容器/虚拟机)影响。
在展示时按 1024 基数转换为 KiB/MiB/GiB 更贴近操作系统常见显示方式。
永远检查 === false 来处理错误,并在 32 位环境小心大数溢出。