PHP ini_set() ohne Auswirkung. upload_max_filesize lässt sich nicht überschreiben

PHP Einstellungen lassen sich zur Laufzeit direkt in den PHP-Skripten verändern. Dazu nutzt man die Funktion ini_set(), um die vorgegebenen Einstellungen aus der php.ini zu überschreiben. Aber nicht alle PHP-Einstellungen lassen sich über diesen Weg überschreiben, so dass sich beispielsweise Besitzer einer Wordpress-Webseite wundern, warum upload_max_filesize nicht erhöht wird:

<?php

// Funktioniert
ini_set('memory_limit','100M');
echo ini_get('memory_limit');

// Funktioniert nicht
ini_set('upload_max_filesize', '100M');
echo ini_get('upload_max_filesize');

// Ausgabe
100M
2M
?>
Warum lässt sich memory_limit ändern, upload_max_filesize wiederum nicht? Grundsätzlich arbeitet PHP mit vier Modi:

  • PHP_INI_USER
    Änderung im Skript via ini_set().
  • PHP_INI_PERDIR
    Änderung via php.ini, .htaccess oder .user.ini. Da man als Anwender in der Regel keinen Zugriff auf die php.ini hat, speichert man eine .htaccess oder .user.ini in seinem Webverzeichnis ab.
  • PHP_INI_SYSTEM
    Änderung nur in der php.ini. Das bedeutet, das nur der Administrator diese Einstellung ändern kann.
  • PHP_INI_ALL
    Einstellung kann überall geändert werden.

Zusammengefasst bedeutet dies, dass der Anwender grundsätzlich alle Einstellungen überschreiben kann, sofern diese nicht als PHP_INI_SYSTEM deklariert sind. Siehe auch die offizielle PHP-Dokumentation Wo Konfigurationseinstellungen gesetzt werden können.

Jede PHP-Einstellung läuft unter einem der genannten Modi. Hier ein Auszug aus dieser vollständigen Liste:

PHP-EinstellungPHP-ModusÜberschreibbar
allow_url_fopenPHP_INI_SYSTEMNein
memory_limitPHP_INI_ALLJa
post_max_sizePHP_INI_PERDIRJa
upload_max_filesizePHP_INI_PERDIRJa
max_execution_timePHP_INI_ALLJa
max_file_uploadsPHP_INI_SYSTEMNein

Hierbei sieht man sehr schnell, dass PHP die Einstellungen unterschiedlich "behandelt". Wer memory_limit oder max_execution_time überschreiben muss, tut dies einfach via ini_set() im Skript. Dagegen müssen post_max_size und upload_max_filesize über die .htaccess bzw. .user.ini überschrieben werden. ini_set() funktioniert leider nicht.

// Auszug .htaccess bzw. .user.ini
upload_max_filesize = 100M
post_max_filesize = 100M
Schlechte Karten hat der Webseiten-Besitzer bei max_file_uploads und allow_url_fopen. Diese kritischen Einstellungen darf nur der Administrator in der php.ini festlegen.