: diskfreespace () (alias disk_free_space () ) gibt die Anzahl der Bytes zurück, die dem aktuellen PHP -Prozess auf dem angegebenen Dateisystem/der angegebenen Datei -Partition verfügbar sind . Die Einheit des Rückkehrwerts ist Bytes . Beachten Sie, dass sie normalerweise den Speicherplatz "verfügbar für den Laufprozess" und nicht die absoluten Gesamt-freien Bytes auf der Festplatte darstellt (auf UNIX wird sie durch reservierte Blöcke und Berechtigungen beeinflusst; sie kann auch auf alle Zeiger-Überlaufprobleme auf 32-Bit-PHP stoßen).
Die wichtigen Details werden nachstehend erläutert und gemeinsame Verwendungen werden angegeben.
<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">// oder 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">"Versäumt zu erhalten"</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">"Anzahl der verfügbaren Bytes: <span class="hljs-subst">$free</span></span></span><span>\n";
}
</span></span>Rückgabewerteinheit : Bytes.
Mögliche Rückgabetypen : Normalerweise kann eine Ganzzahl (int, 64-Bit) auf modernem PHP (64-Bit) eine schwimmende Punktzahl oder ein Überlauf in einigen Umgebungen oder älteren PHP/32-Bit-Umgebungen sein. Die Funktion gibt beim Scheitern falsch zurück und gibt eine Warnung aus.
Parameter : Übergeben Sie den Dateipfad oder den Mountspunkt (z. B. C: \ , /var , /mnt /shary ) und können HTTP /FTP und andere URLs nicht direkt übergeben (erfordert einen lokalen oder montierten Pfad).
Das Ergebnis von diskfreespace () entspricht normalerweise dem Feld "verfügbar" eines Systemaufrufs, wie z . daher:
Bei UNIX/Linux reserviert das Dateisystem normalerweise einen Teil des Blocks (z. B. 5%) für die Root. Nicht-Root-Benutzer können diesen Teil nicht sehen, und der Rückgabewert enthält den reservierten Speicherplatz nicht .
Wenn PHP als nicht privilegierter Benutzer ausgeführt wird, spiegelt der Rückgabewert den Speicherplatz wider, den der Benutzer schreiben kann, und nicht den freien Speicherplatz, den der Superuser verwenden kann.
Für Netzwerkhalterungen (NFS, SMB) oder Container-/Virtual Machine -Umgebungen wird der Rückgabewert auch von Mount -Optionen und Containerbeschränkungen (Quoten, CGroups usw.) beeinflusst.
Um festzustellen, ob die Festplatte "wirklich" frei ist, müssen Sie die Werte in Kombination mit Berechtigungen verstehen, ob es sich um Root- und Dateisystemreservierungs-/Quoteneinstellungen handelt .
disk_total_space () gibt die Gesamtzahl der Bytes (Gesamtkapazität) der Partition zurück, während diskfreespace () die Anzahl der verfügbaren Bytes zurückgibt. Die Verwendungsrate kann berechnet werden, indem Sie die beiden kombinieren:
<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">"Gesamtkapazität: %s, Verfügbar: %s, Gebraucht: %.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>Es gibt zwei häufig verwendete Einheiten für den Speicherplatz:
Binär (häufig in Betriebssystemen verwendet): 1 KIB = 1024 Bytes, 1 MIB = 1024 KIB = 10242 Bytes, 1 Gib = 10243 Bytes.
Decimal (einige Hersteller oder Festplattenspezifikationen): 1 kb = 1000 Bytes, 1 MB = 10002 Bytes.
PHP gibt die Anzahl der Bytes zurück. Wenn Sie ein "menschlich -lesbares" Display benötigen, wird es normalerweise in binären (1024) näher an Betriebssystem -Tools ( df -H usw.) konvertiert (normalerweise 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>Beispiel: 1073741824 Bytes = 1073741824 /1024^3 = 1 Gib (d. H. 1GIB).
32-Bit-Überlauf : Bei 32-Bit-PHP kann eine größere Anzahl von Bytes außerhalb des INT- Bereichs liegen, was zu Fehlern oder schwebenden Punktnäherungen führt. Versuchen Sie, in einer 64-Bit-Umgebung auszuführen, oder verwenden Sie Float /String, um große Zahlen zu verarbeiten.
Überprüfen Sie den Rückgabewert : Rückgabe falsch, wenn die Funktion fehlschlägt, wenden Sie === Falsch, um den Fehler anstelle von if (! $ Kostenlos) zu beurteilen (weil 0 Bytes ebenfalls ein falscher Wert sind).
Berechtigungen und Aufbewahrungsblöcke : Erkenne, dass es mit einem "sichtbaren/verfügbaren für den aktuellen Prozess verfügbaren Bereich" zurückgegeben wird. Wenn Sie als Webserverbenutzer ausgeführt werden, ist das Ergebnis möglicherweise niedriger als der verfügbare Superuser.
Netzwerkdateisystem (NFS/SMB) : Diese Halterungen können instabil oder durch Mount -Optionen betroffen sein und sollten in Verbindung mit einer spezifischen Mount -Konfiguration getestet werden.
Schnelle Überwachung : Wenn Sie für Alarme (z. B. Disk -Nutzung> 90%) verwendet werden, verwenden Sie eine Kombination aus disk_total_space () und diskfreespace () und setzen Sie den Schwellenwert konservativ, um nicht durch zurückgehaltene Blöcke oder Quoten irregeführt zu werden.
<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">// Der zu erkannte Weg</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">"Datenplatteninformationen können nicht erhalten werden(Es kann ein Pfadfehler oder unzureichende Berechtigungen sein)\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">"Weg: <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">"Gesamtkapazität: "</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">"Verfügbar: "</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">"Gebraucht: "</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">// Beispiel Alarmlogik</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"warnen:Die Festplatte wurde für mehr als verwendet 90%!\n"</span></span><span>;
}
</span><span><span class="hljs-comment">// formatBytes Die Funktion ist die gleiche wie oben</span></span><span>
</span></span>diskfreespace () gibt Bytes zurück und repräsentiert den Speicherplatz, der dem aktuellen PHP -Prozess an diesem Mountspunkt zur Verfügung steht , und nicht den "absoluten Leerlaufbetrag", der von allen Benutzern auf der Festplatte verwendet werden kann.
Die Ergebnisse werden durch reservierte Blöcke, Berechtigungen, Quoten, Netzwerkhalterungen und Betriebsumgebungen (Container/virtuelle Maschinen) beeinflusst.
Konvertieren Sie es beim Anzeigen in KIB/MIB/GIB gemäß einer 1024 -Kardinalität, die näher an den gemeinsamen Anzeigemethoden des Betriebssystems liegt.
Überprüfen Sie immer === false, um den Fehler zu bewältigen, und achten Sie auf große Zahlen in 32-Bit-Umgebungen.