2010-09-01 10 views
6

Ogni volta che ho ricevuto questo errore, ho appena aumentato la memoria per risolverlo. Ho un caso in cui, a scopo di test, voglio far sì che una pagina utilizzi tutta la memoria, per quanto grande io abbia impostato memory_limit.Come causare intenzionalmente un "Errore irreversibile: Dimensione di memoria consentita di byte xxx esaurita"

Non ho idea di come fare per farlo.

EDIT: ho provato questo:

<?php 
echo "start"; 
@ini_set('memory_limit', '1M'); 
$test = "a"; 
while (1) { 
    $test = "a" + $test;  
} 
echo "done"; 
?> 

Ma non è precipitato. Alla fine ha appena stampato "starttart" che è strano che sia stato stampato due volte ...

Vorrei un semplice esempio di codice, il "mettere un sacco di cose in memoria" .. beh, so che molto .

+2

essere creativi, questo è tutto quello che posso dire. – BoltClock

+0

La prossima volta, inizia a pubblicare ciò che stai provando e/o hai provato. –

risposta

8

Ecco il problema:

$test = "a" + $test; 

+ in PHP è per l'aritmetica, non stringa concatination. Usa:

$test = "a" . $test; 
+1

* si schiaffeggia in testa con la tastiera più volte * (lo sapevo che ... troppo js ultimamente) – phazei

+1

@phazei: Nessun problema, l'ho fatto anche molte volte e ho programmato PHP dal 2000 ! – Josh

1

Si può fare un ciclo infinito, anche se vorrei sconsigliarlo.

È anche possibile aprire/leggere nella memoria file di grandi dimensioni che superano il limite di memoria, è inoltre possibile scrivere un ciclo che genererebbe una stringa con la quantità di byte che supererebbe il limite di memoria.

Quale è il migliore, nessun indizio. Ma ci sono un paio di opzioni disponibili.

17

Dovrebbe mangiare tutta la memoria.

$a = 'x'; 
while (true) { 
    $a = $a.$a; 
} 
+0

Richiede <1 sec per esaurire la memoria – andrem

+0

Fondamentalmente ho provato che, sebbene sia leggermente più efficiente, non ha fornito risultati migliori. – phazei

+0

@phazei: Vedi la mia risposta. Hai avuto '$ test =" a "+ $ test;' che è molto diverso da '$ test =" a ". $ test; ' – Josh

1
  1. Scarica tutte le immagini di Google Maps.
  2. Quindi ridimensionare utilizzando GD in una scala 1-1.
1

Scrivi una funzione PHP che cerca di trovare un modello all'interno di/dev/random

1
<?php 
$limit = ini_get('memory_limit'); 
$last = strtolower($limit[strlen($limit)-1]); 
switch($last) { 
    case 'g': 
     $limit *= 1024; 
    case 'm': 
     $limit *= 1024; 
    case 'k': 
     $limit *= 1024; 
} 
$limit = $limit + 1;//not needed actually, I assume the script has consumed 1 byte of memory by now... 
$foo = `dd if=/dev/zero bs=$limit count=1`; 
//or, if you don't like the command line: 
$bar = str_repeat($a,$limit); 
+0

In realtà, è necessario il +1 sul limite. Non è andato in crash altrimenti. – phazei

+0

Qui ci sono più overhead di 0 byte, come per esempio le impostazioni sono caricate ecc. Sono piuttosto sorpreso che tu abbia un overhead di 0 byte sugli script PHP, ma ovviamente non posso discutere con i tuoi risultati. – Wrikken

+0

Con lo script viene visualizzato l'errore "Dimensione memoria consentita esaurita". Ma mi sono appena reso conto che se eseguivo un po '(1) {$ byte = $ byte. $ Byte} ricevo un errore di "Memoria insufficiente" molto tempo prima di raggiungere il limite consentito rilevato dal precedente errore.Qualche idea sul perché? – phazei

Problemi correlati