2008-10-23 14 views
6

Tenemos un gran software de administración que está produciendo grandes informes de todo tipo, basados ​​en numerosos bucles, con recuperaciones de bases de datos, creaciones de objetos (muchos), y así sucesivamente.Estrategias para manejar el consumo de memoria en PHP5?

En PHP4 podría funcionar felizmente con un límite de memoria de 64 MB - ahora lo hemos movido a un nuevo servidor y con la misma base de datos - mismo código, los mismos informes no aparecerán sin un límite de memoria ...

Sé que PHP5 ha cambiado muchas cosas bajo el capó, pero ¿hay alguna forma de hacerlo funcionar?

La pregunta al final es, ¿qué estrategias aplica cuando necesita tener sus secuencias de comandos en una dieta?

Respuesta

6

Un gran problema que hemos encontrado es referencias circulares entre objetos que les impiden liberar la memoria cuando quedan fuera del alcance.

Dependiendo de su arquitectura, usted puede ser capaz de usar __destruct() y desarmar manualmente cualquier referencia. Para nuestro problema terminé reestructurando las clases y eliminando las referencias circulares.

0

Desde que se mudó al nuevo servidor, ¿ha verificado que sus variables de sistema MySQL y PHP son idénticas a las que tenían en su servidor anterior?

PHP5 introdujo una gran cantidad de nuevas funcionalidades, pero debido a su mantra de compatibilidad con versiones anteriores, no creo que las diferencias entre PHP5 y PHP4 deberían ser la causa de esta gran un efecto en el rendimiento de una aplicación que es de código y base de datos no tiene sido alterado

¿También se está ejecutando en la misma versión de Apache o IIS?

Suena como un problema que es más probable en relación con su nuevo entorno del sistema que a una actualización de PHP 4 a 5.

0

Bertrand,

Si usted está interesado en la refactorización del código existente entonces yo recomendamos que primero controle su CPU y el uso de la memoria mientras ejecuta los informes. ¿Está bloqueando su servidor SQL o está bloqueando Apache (que sucede si el código PHP está poniendo mucha tensión en el sistema)?

Trabajé en un proyecto que inicialmente empantanó MySQL tan severamente que tuvimos que refactorizar todo el proceso de generación de informes. Sin embargo, cuando terminamos, la carga simplemente se transfirió a Apache (a través del código PHP más complejo). Nuestra solución final fue refactorizar el diseño de la base de datos para proporcionar un mejor rendimiento para las funciones de informes y utilizar PHP para aprovechar lo que no podíamos hacer de forma nativa en MySQL.

Dependiendo de la naturaleza de los informes, podría considerar la desnormalización de los datos que se utilizan para los informes. Incluso podría considerar la construcción de una segunda base de datos que sirva como depósito de datos y esté diseñada según los principios OLAP en lugar de los principios OLTP. Puede comenzar en Wikipedia para obtener una explicación general de OLAP y almacenamiento de datos.

Sin embargo, antes de comenzar a buscar una refacturación seria, ¿ha verificado que sus entornos son lo suficientemente similares mirando phpinfo(); para PHP y SHOW VARIABLES; en MySQL?

0

un concierto!?!

incluso 64MB es grande.

haciendo caso omiso de la discrepancia entre los entornos, (que suena muy peculiar), parece que el código puede necesitar un re-factoring.

cualquier posibilidad de que pueda volver a factorizar el código para que los conjuntos de resultados de las consultas de la base de datos no se vuelquen en las matrices. Le recomendaría que construya un iterador para sus conjuntos de resultados. (a continuación, puede tratarlos como matriz para la mayoría de los propósitos). Hay una gran diferencia entre manejar un registro a la vez, y manejar 10.000 registros a la vez.

En segundo lugar, eche un vistazo al tiempo en que su código está creando múltiples instancias de los datos. Puedes pasar los objetos por referencia. (use el '&'). Tuvimos que hacer algo similar cuando usamos una variante temprana del marco de la horda. un archivo adjunto de 1 MB saldría a 50 MB de numerosas llamadas que pasaron el conjunto de datos completo como una copia, en lugar de como referencia.

+1

Los objetos en PHP5 se pasan por referencia automáticamente. – grantwparks

+0

realmente ?! eso no vencería la idea de alcance. si pasa un objeto a una función, esa función está operando en una copia del objeto, no en el objeto real. (a menos que pase el objeto por referencia). – Bingy

+0

Lo que @grantwparks ha dicho es una gran simplificación ... http://php.net/manual/en/language.oop5.references.php 'Una de las claves -puntos de PHP 5 OOP que a menudo se menciona es que "los objetos se pasan por referencias por defecto". Esto no es del todo cierto. Esta sección rectifica ese pensamiento general usando algunos ejemplos. – MrMesees

Cuestiones relacionadas