2012-01-10 3 views
9

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:

  1. 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) 
    
  2. Quelle que soit, par défaut memory_limit256MB sur le serveur et est mis à 128MB sur cette application (donc 524,288 octets ne devrait pas être un problème).

  3. 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.

+0

utilisez-vous un cadre? – Gerep

+3

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. –

+0

Pas de framework, juste vanilla PHP. Je vais essayer de surveiller la mémoire du système. –

Répondre

8

Je viens de faire une recherche rapide pour « mémoire insuffisante » dans l'arborescence de PHP et a constaté que cette erreur est déclenchée par le gestionnaire de mémoire Zend si un appel d'allocation interne (par ex. malloc) échoue (see code). Donc, oui, on dirait que le système a perdu de la mémoire;)

+0

Oui, c'est une explication simple et sensée que je n'avais même pas envisagée. À l'heure actuelle, le serveur est presque inactif et le gestionnaire de tâches affiche un processus 'wmicpa.exe' avec une utilisation de la mémoire virtuelle extrêmement élevée.Je ferais mieux de demander à l'administrateur du système. –

+0

Je n'ai toujours aucune idée de la raison exacte des erreurs, mais votre réponse et les messages "zend_mm_heap corrompus" dans le journal des erreurs d'Apache pointent vers une sorte de problème d'allocation de mémoire hors de ma portée. –

Questions connexes