Como moví una aplicación PHP a un nuevo servidor (PHP/5.3.8 ejecutándose como módulo Apache 2.2 en Windows Server 2003 R2 de 32 bits) recibo errores aleatorios en el registro de errores de PHP:Error aleatorio "Error fatal PHP: memoria insuficiente"
[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
estoy confundido por las siguientes razones:
es no el mensaje de error estándar que se obtiene cuando se alcanza
memory_limit
:Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 800001 bytes)
Lo que sea,
memory_limit
defecto es256MB
en el servidor y se establece en128MB
en esta aplicación (por lo tanto 524.288 bytes no debería ser un problema).En las líneas reportadas, existe un código, normalmente, tan inocente, tales como el inicio de la definición de funciones ...
function linea($html){
... o foreach() bucles de muy pequeñas matrices:
foreach($perfiles_basicos as $c => $v){
creo que ya he descartado todas las cosas obvias (aunque he buscado la cadena memory_limit
en toda * .php, * .ini, .htaccess y * .conf en el disco duro) y yo he visto código de escritura para detectar y registrar cambios en el límite de "128 MB" (nunca se encontró nada), así que ahora no tengo ni idea.
¿Alguna pista o idea?
Actualización # 1: Apache de error.log
muestra que el servidor Web se reinicia después de obtener un Fuera de error de memoria desde PHP. Algunos son manuales y se reinicia algunos son accidentes de la siguiente manera:
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.
Actualización # 2: ... y la extensión ODBC está registrando el siguiente error:
No se puede cargar el controlador especificado debido al error del sistema 8 (Oracle in instantclient_11_2)
... donde system error 8 mapas a:
ERROR_NOT_ENOUGH_MEMORY 8 (0x8)
Not enough storage is available to process this command.
¿Estás utilizando algún marco? – Gerep
¿Ha comprobado la utilización de la memoria en su sistema? OOM generalmente ocurre cuando el sistema no puede asignar físicamente la memoria, no cuando PHP ha alcanzado su límite para una solicitud. –
Sin marco, solo vainilla PHP. Intentaré monitorear la memoria del sistema. –