2012-01-31 16 views
5

Sto provando ad aumentare la memoria consentita per certi script PHP. Non importa quello che faccio, per esempio questo:PHP non può usare 300MB di RAM

ini_set('memory_limit', '512M'); 

... lo script viene eseguito sempre la memoria a circa 300 MB:

Fatal error: Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) in \\Foo\phpQuery\phpQuery.php on line 255 

Ho verificato con diversi mezzi che memory_limit in realtà è cambiato . Il problema sembra essere che PHP non può allocare fisicamente un totale di 300   MB di memoria (25165824   byte +343810589   byte = 352   MB).

Ho provato sia PHP/5.3.0 e PHP/5.3.9 in due diversi computer basati su Windows con le seguenti specifiche:

  • Windows XP/Windows Server 2003 (entrambi i computer siano 32- scatole bit con 1 GB di RAM)
  • ufficiale di PHP a 32 bit binari VC9
  • esecuzione come 2,2 modulo di Apache (di terze parti file binari VC9 a 32 bit)

capisco che utilizza la metà della RAM fisica costringerà lo swa popping e rallenta le cose come diavolo ma ho solo bisogno di assicurarmi che lo script funzioni davvero così da poter essere distribuito sul server live. Ho anche provato valori più grandi (che hanno generato lo stesso errore) e valori più piccoli (con entrambi i miei script hanno raggiunto il limite o hanno causato un blocco di Apache).

Quale può essere la fonte di questo limite di memoria apparentemente hardcoded?

Aggiornamento n. 1: Ho eseguito ulteriori test con la casella di Windows Server 2003 (che in realtà è una macchina virtuale VMWare). Ho aumentato la RAM "fisica" a 2   GB e ho verificato che il file di paging può crescere fino a 1152   MB. Task Manager mostra che il carico corrente della transazione è 886   MB e ci sono 1,5   GB di memoria fisica libera. Tuttavia, sto ottenendo lo stesso errore con esattamente le stesse cifre.

Aggiornamento n. 2: Come ho già detto, la direttiva memory_limit va bene. Si presenta sia in ini_get() sia in phpinfo(). Il messaggio di errore che otterresti è leggermente diverso dal mio; il mio indica un crash di PHP. Si prega di confrontare:

Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) 
Allowed memory size of 25165824 bytes exhausted (tried to allocate 343810589 bytes) 

Proverò a comporre uno script per riprodurre il problema e riportarlo.

+0

Se PHP sta cercando di afferrare tutta quella memoria in una volta sola, suppongo che tu stia cercando di caricare un file .... prova a caricare il file in blocchi piuttosto che in una volta –

+0

«Se non riesci a ottimizzare , compra più RAM ... »Beh, qualche volta è sbagliato ...; Sei sicuro di aver bisogno di tutta quella memoria? 300 MB sono già una quantità enorme. Forse puoi ottimizzare un po 'il tuo script ... – Macmade

+2

Sei sicuro al 100% che il sistema operativo abbia più di 300 MB di memoria libera da allocare? – DaveRandom

risposta

4

Un'eccezione OOM è diversa dalle avvertenze limite di memoria.

Ciò significa che PHP non può effettivamente allocare la memoria perché le risorse insufficienti sono disponibili all'interno del sistema operativo.

È necessario verificare che il sistema disponga di memoria/paging sufficienti per supportarlo.

+0

Ho aggiornato la domanda. Il server, a quanto pare, ha abbastanza memoria. –

0

Prova con max_input_time, a volte quando PHP dice memory_limit in realtà significa max_input_time (-1 è infinito per questo).

+0

Buon punto. Ma il valore è già impostato su 20 minuti e l'arresto si verifica prima. Non ho lavorato su questo da quando ho fatto la domanda ma so che prima o poi avrò bisogno di correggere il codice in modo che non abbia bisogno di tanta memoria in primo luogo. –

+0

Uhmm, quindi non posso più aiutare scusa! – R01010010