Pregunta

Estoy portar una aplicación web grande para un entorno de alojamiento web compartido. La aplicación fue escrito en PHP 4. El nuevo entorno tiene PHP 5.2.

Por alguna razón, la aplicación pierde grandes cantidades de memoria cuando se ejecuta en PHP 5.2. Puedo literalmente ver el uso de memoria que va a través del techo utilizando memory_get_usage (), hasta que se alcanza el límite de 64 MB (que es muy abundante en un entorno compartido, el sitio utiliza para ejecutar con 12 o 16 MB en PHP 4).

Sospecho que esto es un efecto secundario de algo que ha cambiado en PHP 5, lo más probable es que el manejo de las referencias a objetos en los argumentos. Sin embargo, la búsqueda de la conducta en particular (s) que causa (s) de la fuga es extremadamente difícil, ya que la aplicación es muy compleja, y en parte no muy bien escrito (sí, es mía).

A medida que la aplicación se instala en un espacio web compartido, no puedo utilizar las instalaciones de depuración clásicos (por lo que yo sé). Me gustaría mucho, mucho gustaría evitar recrear el ambiente a nivel local, ya que estoy trabajando en el proyecto, literalmente, todo el día por algún tiempo.

Así que mis preguntas son:

  • ¿Alguien sabe trampas típicas PHP4 => 5 de transición, sobre todo cuando se trata de grandes cantidades de objetos, que podría ser la causa de la fuga de mi (s)

  • ¿Alguien sabe algún tipo de depurador independiente, escritura-única herramienta "gráfica volcado alcance" para las variables utilizadas por PHP que podrían ayudar a averiguar qué variables están comiendo estos enormes cantidades de memoria?

¿Fue útil?

Solución

Para resolver este problema lo haría:

  1. Perfil del guión con Xdebug + WinCacheGrind (o algún otro perfilador) y / o FirePHP.
  2. Activar el modo estricto para obtener todos los avisos de error + php.

Hacer eso, usted será capaz de:

  • Optimizar su código. (Eliminación de los errores / avisos / advertencia puede acelerar su código)
  • Limpiar el código. (Uso de la sintaxis de objetos PHP5 adecuada sólo puede ser bueno para el rendimiento).

El modelo de objetos cambió totalmente desde PHP4 a PHP5. Por supuesto, el modo estricto le dirá que no se debe utilizar un explícito "pasado por referencia".

Otros consejos

Uno común que encontré en una liberación de 5.2 era el strtotime filtró y sin memory_get_usage la captura de él. El cambio a strptime fija el problema.

Hay un informe de error para esto durante 5.2.8 - http: // errores .php.net / bug.php? id = 46889 .

Sin depurador se puede abrir una secuencia de comandos que usted piensa utilizar muchas memoria y poner en función memory_get_usage locales críticos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top