Pregunta

Tenemos un gran software de administración que produce grandes informes de todo tipo, basados ??en numerosos bucles, con recuperaciones de bases de datos, creaciones de objetos (muchos), etc.

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: el 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 manera de hacerlo funcionar?

La pregunta al final es: ¿qué estrategias aplica cuando necesita tener sus scripts en una dieta?

¿Fue útil?

Solución

Un gran problema con el que nos hemos encontrado fue con las referencias circulares entre los objetos que impiden que liberen memoria cuando están fuera del alcance.

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

Otros consejos

Cuando necesito optimizar los recursos en cualquier script, siempre trato de analizar, perfilar y depurar mi código, uso xDebug , y xDebug Profiler , hay otras opciones como APD , y Benchmark Profiler .

Además te recomiendo estos artículos:

Desde que se mudó al nuevo servidor, ¿ha verificado que las variables de su sistema MySQL y PHP son idénticas a las de su antiguo servidor?

PHP5 introdujo muchas funcionalidades nuevas, pero debido a su mantra de compatibilidad con versiones anteriores, no creo que las diferencias entre PHP5 y PHP4 deban estar causando un efecto tan grande en el rendimiento de una aplicación cuyo código y base de datos no hayan sido alterado.

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

Parece un problema que probablemente esté relacionado con su nuevo entorno de sistema que con una actualización de PHP4 a 5.

Bertrand,

Si está interesado en refactorizar el código existente, le recomendaría que primero supervise el uso de su CPU y memoria mientras ejecuta los informes. ¿Está bloqueando su servidor SQL o está bloqueando Apache (lo que ocurre si el código PHP pone mucha tensión en el sistema)?

Trabajé en un proyecto que inicialmente bloqueó MySQL con tanta severidad que tuvimos que refactorizar todo el proceso de generación de informes. Sin embargo, cuando terminamos, la carga fue simplemente transferida 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 usar PHP para compensar 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 almacén de datos y esté diseñada en torno a los principios OLAP en lugar de los principios OLTP. Puede comenzar en Wikipedia para obtener una explicación general de OLAP y el almacenamiento de datos.

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

Un concierto!?!

incluso 64 MB es grande.

ignorando la discrepancia entre los entornos (lo que suena muy peculiar), parece que el código puede necesitar un cambio de factorización.

en cualquier posibilidad, puede volver a factorizar su código para que los conjuntos de resultados de las consultas de la base de datos no se vuelquen en arreglos. Le recomendaría que construya un iterador para sus conjuntos de resultados. (por lo que puede tratarlos como una matriz para la mayoría de los propósitos). hay una gran diferencia entre el manejo de un registro a la vez y el manejo de 10,000 registros a la vez.

En segundo lugar, eche un vistazo al clima en el que su código está creando varias instancias de los datos. ¿Puedes pasar los objetos por referencia? (use '& amp;'). Tuvimos que hacer algo similar al usar una variante temprana del marco de la horda. un archivo adjunto de 1 MB saldría a 50 MB de numerosas llamadas que pasaron todo el conjunto de datos como una copia, en lugar de una referencia.

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