: diskfreespace() (エイリアスdisk_free_space() )は、指定されたファイルシステム/パーティションで現在のPHPプロセスで利用可能なバイト数を返します。戻り値の単位はバイトです。通常、ディスク上の絶対的な総自由バイトではなく、「実行プロセスが利用可能」のスペースを表すことに注意してください(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>戻り値ユニット:バイト。
可能なリターンタイプ:通常、最新のPHP(64ビット)の整数(INT、64ビット)は、一部の環境または古いPHP/32ビット環境で浮動小数点数またはオーバーフローである場合があります。関数は障害時にfalseを返し、警告を発します。
パラメーター:ファイルパスまたはマウントポイント(たとえば、 C:\ 、 /var 、 /mnt /share )に渡され、HTTP /ftpおよびその他のURL(ローカルまたはマウントされたパスが必要)で直接通過できません。
DiskFreespace()の結果は、通常、UNIXのSTATVFSまたはWindows同等のシステムコールの「利用可能な」フィールドに相当します。これは、現在のユーザー(または実行中のプロセス)が利用できるバイト数を表します。したがって:
Unix/Linuxでは、ファイルシステムは通常、rootのブロックの一部(5%など)を留保します。非ルートユーザーはこの部分を見ることができず、返品値には予約済みのスペースが含まれません。
PHPが非主要なユーザーとして実行されている場合、返品値は、スーパーユーザーが使用できるすべての自由スペースではなく、ユーザーが書き込むことができるスペースを反映します。
ネットワークマウント(NFS、SMB)またはコンテナ/仮想マシン環境の場合、リターン値は、マウントオプションとコンテナ制限(クォータ、CGROUPなど)の影響も受けます。
したがって、ディスクが「本当に」無料であるかどうかを判断するには、ルートであるかどうか、およびファイルシステムの予約/クォータ設定であろうと、許可と組み合わせて値を理解する必要があります。
disk_total_space()パーティションのバイト(総容量)の総数を返し、 diskfreespace()は利用可能なバイトの数を返します。使用率は、2つを組み合わせることで計算できます。
<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>ディスクスペースには一般的に使用される2つのユニットがあります。
バイナリ(オペレーティングシステムで一般的に使用): 1 KIB = 1024バイト、1 MIB = 1024 KIB = 10242バイト、1 GIB = 10243バイト。
小数(一部のメーカーまたはハードディスク仕様): 1 kb = 1000バイト、1 Mb = 10002バイト。
PHPはバイト数を返します。 「人間読み取り可能な」ディスプレイが必要な場合は、通常、オペレーティングシステムツール( DF -Hなどに近いバイナリ(1024)で変換されます。通常は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ビット環境で実行するか、フロート/ストリングを使用して多数を処理してください。
return値を確認します: falseを返す関数が失敗したら、 === falseを適用して、 if(!$ free)ではなく、エラーを判断します)(0バイトもfalse値であるため)。
権限と保持ブロック:「現在のプロセスで可視/利用可能」スペースで返されることを認識してください - 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()はバイトを返し、ディスク上のすべてのユーザーが使用できる「絶対的なアイドル量」ではなく、このマウントポイントで現在のPHPプロセスで利用可能なスペースを表します。
結果は、ファイルシステムの予約ブロック、許可、クォータ、ネットワークマウント、および動作環境(コンテナ/仮想マシン)の影響を受けます。
表示するときは、オペレーティングシステムの一般的な表示方法に近い1024のカーディナリティに従って、Kib/Mib/Gibに変換します。
必ず=== falseを確認してエラーを処理し、32ビット環境での大量のオーバーフローに注意してください。