PHP Suhosin Speicherprobleme
Bei der Verwendung von PHP und Suhosin kann es zu Problemen bei der Speicherverwaltung bzw. der Limits kommen.
Umgebung:
Debian 6.0 Kernel 2.6.32-5-686/ PHP 5.3.3-7+squeeze3 / Suhosin Patch 0.9.9.1
Ausgangssituation:
- PHP Skript wird via CLI ausgeführt
- PHP CLI Konfiguration (/etc/php5/cli/php.ini) setzt das Speicherlimit auf unbegrenzt
memory_limit = -1
http://php.net/memory-limit
- dennoch tritt ein Speicherfehler auf, z.B. bei der Verwendung großer Datenmengen innerhalb von smarty:
PHP Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 7105434 bytes) in /srv/httpd/vhosts/localhost/htdocs/secreporter/lib/common/smarty/sysplugins/smarty_internal_templatebase.php on line 195
- andere Fehlermeldungen
ALERT - script tried to disable memory_limit by setting it to a negative value -1 bytes which is not allowed (attacker 'REMOTE_ADDR not set', file 'unknown')
ALERT - script tried to increase memory_limit to 268435456 bytes which is above the allowed value .... file '/srv/httpd/vhosts/www.domain.de [Mehr Informationen] /htdocs/wp-admin/admin.php', line 109)
Abhilfe:
Hier hilft es den default Suhosin Wert suhosin.memory_limit
von 0 auf einen entsprechenden Wert zu setzen - dieser kann auch geringer als das PHP memory_limit Wert sein. Anscheinend ist hier im Suhosin ein fester 64M Wert vorgegeben, welcher hier Probleme macht.
/etc/php5/conf.d/suhosin.ini
;suhosin.memory_limit = 0
Will man das Skripte nur soviel Ram benutzen dürfen wie es in der php.ini (memory_limit = )
festgelegt wird, sollte der Wert bei 0 bleiben. Jeder andere Wert erlaubt dem Skript den Ram der php.ini + den suhosin Wert in MB zu nutzen.
Beschreibung:
As long scripts are not running within safe_mode they are free to change the memory_limit to whatever value they want. Suhosin changes this fact and disallows setting the memory_limit to a value greater than the one the script started with, when this option is left at 0. A value greater than 0 means that Suhosin will disallows scripts setting the memory_limit to a value above this configured hard limit.