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.
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 –
«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
Sei sicuro al 100% che il sistema operativo abbia più di 300 MB di memoria libera da allocare? – DaveRandom