Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Como optimizar memoria cuando se usa require, require_once y daemon

Estas en el tema de Como optimizar memoria cuando se usa require, require_once y daemon en el foro de PHP en Foros del Web. Saludos.. Necesito de su ayuda para optimizar el uso de memoria de mis proceso. Bueno me explico. Actualmente trabajo en un proyecto el cual ejecuta ...
  #1 (permalink)  
Antiguo 05/12/2014, 10:24
Avatar de EduardoWallas  
Fecha de Ingreso: diciembre-2014
Ubicación: Jalisco
Mensajes: 6
Antigüedad: 10 años
Puntos: 0
Pregunta Como optimizar memoria cuando se usa require, require_once y daemon

Saludos..

Necesito de su ayuda para optimizar el uso de memoria de mis proceso. Bueno me explico.

Actualmente trabajo en un proyecto el cual ejecuta muchas tareas en segundo plano en un ciclo infinito (daemon) mediante un while, actualmente se ejecutan al rededor de 1500 procesos de este tipo y me provoca un crecimiento constante de la memoria ocupada por proceso.

El proyecto esta basado en un sistema de capas (4), en el cual las 2 primeras capas se incluyen mediante un require_once solo una vez y las capaz 3 y 4 cada que son solicitadas mediante un require. Estas ultimas capas son constantemente llamadas por el daemon.

Bueno esto produce que el script principal crezca y crezca, ademas los daemons pueden estar corriendo por varias semanas. al ser este daemon cíclico lógico es que vuelva a llamar a los mismo scripts cada que se repite el ciclo y los vuelva a incluir con el require

Bueno algunas de mis dudas son:

* entre cada solicitud de las ultimas capaz que son con require existe el modo de destruirlo cuando ya realizaron su función y asi evitar el acumulado?.

* El recolector de PHP debería de reciclar la memoria cuando se deja de utilizar en vez de asignarle mas entre cada iteracion del daemon?

Bueno quedo en espera de sus comentarios y agradeciendo que se dieron el tiempo a leer mi problematica
  #2 (permalink)  
Antiguo 05/12/2014, 11:06
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Respuesta: Como obtimizar memoria cuando se usa require, require_once y daemon

Cita:
* entre cada solicitud de las ultimas capaz que son con require existe el modo de destruirlo cuando ya realizaron su función y asi evitar el acumulado?.
No. El código es incluido y evaluado en contexto actual. Una vez ocurrió esto, no es posible desalojarlo hasta que el script finalice.
Cita:
* El recolector de PHP debería de reciclar la memoria cuando se deja de utilizar en vez de asignarle mas entre cada iteracion del daemon?
No. Porque lo que estas haciendo es incluir ciclicamente archivos, php trae al contexto actual los archivos y los evalua. Para que sean atrapados por el recolector deberias de forma explicita (mediante unset) avisarle que ya no los usaras mas.

Mas alla de eso, creo que le estas errando de camino (y de terminologia) para tal implementacion.

Un deamon es un proceso que si muere vuelve a nacer y nunca puede ser destruido, en php no puedes programar deamons, lo que tu estas haciendo es un loop infinito (como si fuese un socket), que es otra cosa diferente.

Para solventar el problema, la mejor manera es que recurras a otro lenguaje para hacer el loop llamando a php, o bien desde php pero no con includes o requires sino con exec.

La idea seria que dentro del loop, llames con exec al archivo, por ejemplo:
Código PHP:
Ver original
  1. exec("php capa1.php");

De esta forma, evitaras el aumento de consumo.

Si optas por poner el loop en otro lenguaje (por ejemplo bash) la idea es la misma, llamar al archivo php dentro del loop.

No queda muy en claro que tipo de conexion tienen las 4 capas entre si ni de que forma interactuan, posiblemente tengas que pensar alguna forma de comunicarlas sin que esten en el mismo contexto. Una opcion podria ser pasando parametros por GET en cada llamada.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 05/12/2014, 12:51
Avatar de EduardoWallas  
Fecha de Ingreso: diciembre-2014
Ubicación: Jalisco
Mensajes: 6
Antigüedad: 10 años
Puntos: 0
Respuesta: Como optimizar memoria cuando se usa require, require_once y daemon

Gracias por tu pronta respuesta, me has aclarado mucho el panorama y general consideraría que es la solución usar exec, dadas las dimensiones del proyecto tendría que ver el impacto con otros módulos.

Y me he planteado una nueva pregunta, así como es posible ver la cantidad de memoria que ocupa un script y las variables que actualmente están en uso ¿Existe una forma de ver el contenido total de un script en ejecución?, por ejemplo cuando se hace un tail a un archivo y podemos ver sus contenido hasta como va cambiando
  #4 (permalink)  
Antiguo 05/12/2014, 15:17
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Respuesta: Como optimizar memoria cuando se usa require, require_once y daemon

Cita:
¿Existe una forma de ver el contenido total de un script en ejecución?, por ejemplo cuando se hace un tail a un archivo y podemos ver sus contenido hasta como va cambiando
No. O al menos no la conozco.

Ten en cuenta que un tail se realiza sobre un archivo fisico (generalmente secuencial) del que se conoce su ubicación, en el caso del script php, lo que el lenguaje compila y ejecuta lo manda a valla a saber que lugar de la RAM, ademas de que realiza optimizaciones y no manda todo a memoria, algunas cosas las desaloja y las vuelve a compilar al vuelo cuando las necesita.

Lo que si conozco son los ticks que te pueden servir para tener una idea de cuantos "ticks" (valla nombre ) ocurrieron hasta el momento.
En pocas palabras, un tick es un evento especial que se produce internamente en PHP cada vez que se ha ejecutado una serie de declaraciones. Estas declaraciones son internos a PHP y corresponden en términos generales a cada linea ejecutada terminada en ";" y cada bloque {}.

Con este valor puedes darte una idea de cuantas lineas y bloques viene ejecutando php en tiempo real.
En tu caso como es un loop infinito, al final de cada iteracion deberías meter este valor en un archivo y luego leerlo regularmente de forma externa.
Ahí si podrías hacer un tail de la ultima linea sobre ese archivo.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 05/12/2014 a las 15:22
  #5 (permalink)  
Antiguo 05/12/2014, 18:11
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Como optimizar memoria cuando se usa require, require_once y daemon

Cita:
Gracias por tu pronta respuesta, me has aclarado mucho el panorama y general consideraría que es la solución usar exec, dadas las dimensiones del proyecto tendría que ver el impacto con otros módulos.
Usar exec es tu ultima opción ya que existen otras alternativas como usar MQ(Message Queueing): http://blog.codepath.com/2013/01/06/...essage-queues/ y existen una gran variedad de alternativas: http://queues.io/ standalone o como servicio.
Y si quieres seguir por el camino que planteaste originalmente puedes utilizar:
http://daemon.io/
https://github.com/shaneharter/PHP-Daemon
Cita:
¿Existe una forma de ver el contenido total de un script en ejecución?, por ejemplo cuando se hace un tail a un archivo y podemos ver sus contenido hasta como va cambiando
Puedes hacer profiling con alguna herramienta de debug: http://xdebug.org/docs/code_coverage existen otras alternativas como: http://phpdbg.com/docs
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #6 (permalink)  
Antiguo 08/12/2014, 11:35
Avatar de EduardoWallas  
Fecha de Ingreso: diciembre-2014
Ubicación: Jalisco
Mensajes: 6
Antigüedad: 10 años
Puntos: 0
Respuesta: Como optimizar memoria cuando se usa require, require_once y daemon

Muchas gracias, el sistema trabaja con colas de mensajes, revisare a fondo las opciones que me has dado ya que la similitud con lo actualmente hago es bastante cerca

Etiquetas: ciclos, daemon, memoria, requiere, require_once
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:54.