Depuis que j'ai déplacé une application PHP vers un nouveau serveur (PHP/5.3.8 fonctionnant comme un module Apache 2.2 sur Windows Server 2003 R2 32 bits), je reçois des erreurs aléatoires dans l'erreur PHP journal:Erreurs aléatoires "Erreur fatale PHP: Mémoire insuffisante"
[09-Jan-2012 19:45:12] PHP Fatal error: Out of memory (allocated 786432) (tried to allocate 17 bytes) in D:\site\util\odbc-connection.php on line 675
[10-Jan-2012 17:56:49] PHP Fatal error: Out of memory (allocated 1310720) (tried to allocate 6144 bytes) in D:\site\logic\data.php on line 630
[10-Jan-2012 17:58:52] PHP Fatal error: Out of memory (allocated 524288) (tried to allocate 393216 bytes) in D:\site\users\edit-user.php on line 458
Je suis confus pour les raisons suivantes:
Il est pas le message d'erreur standard que vous obtenez lorsque
memory_limit
est atteint:Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 800001 bytes)
Quelle que soit, par défaut
memory_limit
256MB
sur le serveur et est mis à128MB
sur cette application (donc 524,288 octets ne devrait pas être un problème).Dans les lignes signalées il y a normalement assez de code innocent, comme le début des définitions de fonction ...
function linea($html){
... ou boucles foreach() des tableaux très petits:
foreach($perfiles_basicos as $c => $v){
Je pense que je l'ai déjà abandonné toutes les choses évidentes (je l'ai même cherché la chaîne memory_limit
dans tout * .php, * .ini, .htaccess et fichiers * .conf sur le disque dur) et moi 've w code ritten pour détecter et enregistrer les changements à la limite "128MB" (rien n'a jamais été trouvé), donc je suis assez désemparé en ce moment.
Un indice ou une idée?
Mise à jour # 1: Apache error.log
montre que le serveur Web se redémarré après je reçois un erreur de mémoire de PHP. Certains sont redémarrages manuels et certains sont des accidents comme ceci:
zend_mm_heap corrupted
12] [notice] Child 2524: Child process is exiting
[Mon Jan 09 19:45:12 2012] [notice] Parent: child process exited with status 1 -- Restarting.
[Mon Jan 09 19:45:13 2012] [warn] Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
[Mon Jan 09 19:45:13 2012] [notice] Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 configured -- resuming normal operations
[Mon Jan 09 19:45:13 2012] [notice] Server built: Sep 24 2011 00:32:50
[Mon Jan 09 19:45:13 2012] [notice] Parent: Created child process 6256
[Mon Jan 09 19:45:13 2012] [notice] Disabled use of AcceptEx() WinSock2 API
[Mon Jan 09 19:45:13 2012] [warn] Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
[Mon Jan 09 19:45:14 2012] [warn] Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
[Mon Jan 09 19:45:14 2012] [notice] Child 6256: Child process is running
[Mon Jan 09 19:45:14 2012] [notice] Child 6256: Acquired the start mutex.
[Mon Jan 09 19:45:14 2012] [notice] Child 6256: Starting 400 worker threads.
[Mon Jan 09 19:45:14 2012] [notice] Child 6256: Listening on port 443.
[Mon Jan 09 19:45:14 2012] [notice] Child 6256: Listening on port 80.
Mise à jour # 2: ... et l'extension ODBC est l'enregistrement de l'erreur suivante:
No se puede cargar el controlador especificado debido al error del sistema 8 (Oracle in instantclient_11_2)
... où system error 8 cartes à:
ERROR_NOT_ENOUGH_MEMORY 8 (0x8)
Not enough storage is available to process this command.
utilisez-vous un cadre? – Gerep
Avez-vous vérifié l'utilisation de la mémoire sur votre système? OOM se produit généralement lorsque le système ne peut pas physiquement allouer la mémoire, pas lorsque PHP a atteint sa limite pour une demande. –
Pas de framework, juste vanilla PHP. Je vais essayer de surveiller la mémoire du système. –