Hallo ursus,
vom Grundsatz her muss es wohl so ähnlich laufen. Was mir nicht klar ist: php.net schreibt, dass memory_limit hoch genug sein müsse. Echt jetzt? Muss ein POST erstmal komplett in dem RAM, bevor Files in Temp-Dateien geschrieben werden?
Zum Bau als Klasse: Eine "heiße Kartoffel" Klasse (erzeugen, verwenden, schnell wieder fallen lassen) kann sinnvoll sein, wenn man für eine bestimmte Klasse von Operationen einen Arbeitskontext braucht. Wenn es nur genau eine Operation gibt, ist eine Funktion sinnvoller. Wenn Du außer der maximalen Größe für eine Datei die anderen Werte ebenfalls bereitstellen willst - okay, aber dann müsste man nochmal über den Klassennamen nachdenken.
(2) Die Doppelhaltung der Symbole als String und Array ist merkwürdig, das geht schöner. Und du interpretierst zu viel, PHP kennt nur K, M und G. Alles andere sind Bytes.
(3) PHP kennt eine min-Funktion. Die musst Du nicht von Hand realisieren.
(4) Wenn man schon mit Regexen rangeht, kann man sie auch richtig nutzen. Ich habe mal benannte Gruppen eingesetzt und parse damit den INI-Wert in Zahl und Skalierbuchstabe. Das ermitteln des Skalierungswertes geht mit einem einfachen stripos, dafür brauche ich keine Array-Version der Skalierbuchstaben.
(5) PHP_INT_MAX als Defaultwert ist meines Erachtens zu viel. Ein 64-bit PHP liefert hier 2^63-1, das ist im Exabyte-Bereich 😲.
Meine Implementierung wäre (wobei ich upload_max_filesize und post_max_size ggf. nicht öffentlich machen würde, und der Einfluss von memory_limit mir noch unbekannt ist):
class UploadLimits {
public $max_filesize = 0;
public $upload_max_filesize = 0;
public $post_max_size = 0;
function __construct () {
$this->upload_max_filesize = $this->extval2integer( ini_get('upload_max_filesize') );
$this->post_max_size = $this->extval2integer( ini_get('post_max_size') );
$this->max_filesize = min($this->upload_max_filesize, $this->post_max_size);
}
private function extval2integer ( $val ) {
$matches = [];
$result = 0;
$success = preg_match("/^(?<val>\d+)(?<sym>.?)/i", $val, $matches);
if ($success > 0) {
$scale = stripos("KMG", $matches["sym"]);
$result = (int)($matches["val"]) * ($scale === FALSE ? 1 : 1024**($scale+1));
}
return $result > 0 ? $result : 2**31;
}
}
Rolf
sumpsi - posui - clusi