2012-07-13 14 views
16

Para dar un contexto:¿Cómo funciona realmente el uso de la memoria Apache PHP?

Tuve una discusión con un colega recientemente sobre el uso de cargadores automáticos en PHP. Yo estaba discutiendo a favor de ellos, él en contra.

Mi punto de vista es que los autocargadores pueden ayudarlo a minimizar la dependencia manual de la fuente, lo que a su vez puede ayudarlo a reducir la cantidad de memoria consumida al incluir muchos archivos grandes que puede que no necesite.

Su respuesta fue que incluir archivos que no necesita no es un gran problema porque después de que se haya incluido un archivo, el proceso secundario de Apache lo mantendrá en la memoria y esta porción de memoria estará disponible para solicitudes posteriores. Sostiene que no debe preocuparse por la cantidad de archivos incluidos porque muy pronto se cargarán en la memoria y se usarán según demanda de la memoria. Por lo tanto, la memoria es un problema menor y la carga adicional de tratar de encontrar el archivo que necesita en el sistema de archivos es mucho más preocupante.

Es un tipo inteligente y tiende a saber de lo que está hablando. Sin embargo, siempre pensé que la memoria utilizada por Apache y PHP era específica para esa solicitud particular que se manejaba. A cada solicitud se le asigna una cantidad de memoria igual a la opción memory_limit PHP y cualquier compilación y procesamiento fuente solo es válido durante la vigencia de la solicitud.

Incluso con cachés de código de operación como APC, pensé que la solicitud individual aún tenía que cargar cada archivo en su propia porción de memoria y que APC es solo un atajo para tenerlo precompilado para el proceso de respuesta .

He estado buscando documentación sobre esto pero no he podido encontrar nada hasta el momento. Realmente agradecería que alguien me señale alguna documentación útil sobre este tema.

ACTUALIZACIÓN:

Solo para aclarar, la parte de discusión autocargador era más de un contexto :).

Puede que no haya sido claro pero mi pregunta principal es si Apache unirá sus recursos para responder a múltiples solicitudes (especialmente la memoria utilizada por los archivos incluidos), o si cada solicitud deberá recuperar el código requerido para satisfacer la ruta de ejecución aislada de otras solicitudes manejadas desde el mismo proceso.

e.g .: Los archivos 1, 2, 3 y 4 tienen un tamaño igual de 100 KB cada uno. Solicitud A incluye archivos 1, 2 y 3. Solicitud B incluye archivos 1, 2, 3 y 4.

En su mente que está pensando que Solicitar una consumirá 300 KB para la totalidad de ella es la ejecución y la Solicitud B sólo se consuma 100KB adicionales porque los archivos 1,2 y 3 ya están en la memoria.

En mi opinión son 300KB y 400KB porque ambos se procesan independientemente (si es por el mismo proceso).

Esto lo lleva de vuelta a su argumento de que "simplemente incluya el lote porque lo usará de todos modos", en lugar de "solo incluir lo que necesita para mantener el tamaño de la solicitud".

Esto es bastante fundamental para la forma en que me acerco a la construcción de un sitio web PHP, por lo que me gustaría saber si estoy fuera de lugar aquí.

Siempre he creído que la memoria del sitio web a gran escala es el recurso más valioso y más preocupante que el sistema de archivos comprueba si hay un autocargador que el kernel probablemente almacena en la memoria caché.

¡Está en lo cierto, es hora de hacer una evaluación comparativa!

Respuesta

2

Eres el ninja más sabio, saltamontes.

Los cargadores automáticos no cargan el archivo de clase hasta que se solicite la clase. Esto significa que usarán a lo sumo la misma cantidad de memoria que el manual incluye, pero generalmente mucho menos.

Las clases se actualizan cada vez que se solicita un archivo, incluso si un subproceso de apache puede manejar varias solicitudes, por lo que el eventuall de todos sus amigos se lee "no se mantiene".

Puede probar esto poniendo un eco 'foo'; sobre la definición de clase en el archivo de clase. Verá en cada nueva solicitud que la línea se ejecutará independientemente de si carga automáticamente o incluye manualmente todo el mundo de los archivos de clase al inicio.

No pude encontrar ninguna documentación concisa sobre esto, puedo escribir algunas con algunos ejemplos de uso de memoria, ya que también tuve que explicar esto a otros y mostrar evidencia para lograr que se asimilara. Creo la gente de Zend no creía que nadie pudiera ver los beneficios de la carga automática.

Sí, la APC y tal (como todas las soluciones de almacenamiento en caché) puede superar los negativos de recursos e incluso obtener pequeñas ganancias en el rendimiento, pero consume mucha memoria innecesaria si hace esto en una cantidad no trivial de bibliotecas y atendiendo a una gran cantidad de clientes Pruebe algo como cargar una buena porción de las bibliotecas de peras en un archivo de inclusión masivo mientras maneja 500 conexiones que llegan a su página al mismo tiempo.

Incluso usando cosas como Apc, usted se beneficia del uso de autocargadores con clases no espaciales (la mayoría del código php actual) ya que puede ayudar a evitar la contaminación global del espacio de nombres cuando se trata de grandes cantidades de bibliotecas de clases.

4

Así es como se ganan los argumentos: ejecute un punto de referencia realista y esté en el lado derecho de los números.

He tenido esta misma discusión, así que probé un experimento. Utilizando APC, probé una aplicación Kohana con una sola inclusión monolítica (que contiene todo Kohana) y con el autocargador estándar. El resultado final fue que el único incluir fue más rápido a una tasa estadísticamente irrelevante (menos del 1%) pero utilizó un poco más de memoria (de acuerdo con las funciones de memoria de PHP). Ejecutar la prueba sin APC (o XCache, etc.) no tiene sentido, así que no me molesté.

Así que mi conclusión fue continuar el uso de carga automática porque es mucho más fácil de usar. Pruebe lo mismo con su aplicación y muestre a su amigo los resultados.

Ahora no necesita adivinar.

Descargo de responsabilidad: Yo no estaba usando Apache. No puedo enfatizar lo suficiente como para ejecutar sus propios puntos de referencia en su propio hardware en su propia aplicación. No confíes en que mi experiencia será tuya.

+0

Gracias Matthew, he hecho una edición de la publicación original en caso de que eso ayude, pero definitivamente haré algunas pruebas. – Sirhara

+0

No estoy seguro de cómo mod_php maneja el servicio de la misma página, pero si utiliza un caché de código de operación, entonces los archivos PHP en sí mismos definitivamente estarán en la memoria compartida. La forma en que entiendo vainilla PHP, es que en cada solicitud el archivo se abre, analiza y ejecuta ... por lo que no estoy seguro de dónde se estaría produciendo el intercambio de memoria. Creo que todavía se reduce a la evaluación comparativa ... use algo como 'ab' para ejecutar pruebas. Estoy seguro de que verá que usar o no la aplicación automática depende de las preferencias personales ... No creo que el rendimiento sea significativamente diferente. – Matthew

0

Este es mi opionion.

creo cargadores automáticos son una muy mala idea por las siguientes razones

  1. me gusta saber qué y dónde mis guiones están agarrando los datos/código de.Facilita la depuración.
  2. Esto también tiene problemas de configuración en la medida en que si uno de sus desarrolladores cambia el archivo (actualización, etc.) o la configuración y las cosas dejan de funcionar, es más difícil averiguar dónde está roto.
  3. También creo que es una programación perezosa.

En cuanto a problemas de memoria/preformación, es igual de barato comprar más memoria para la computadora si está teniendo problemas con eso.

+1

¿Podría explicar un poco sobre por qué cree que se trata de una programación perezosa? Tengo curiosidad porque parece lo suficientemente razonable como para tener una función de autocargador. – Dave

+1

@Dave - Creo que es perezoso no ser explícito en cuanto a lo que constituye su secuencia de comandos y confiar en que el intérprete encuentre el código apropiado. También ayuda con la documentación y el mantenimiento futuro. ¿Por qué es tanto esfuerzo escribir 'require'? –

+0

@Ed se puede argumentar que, en igualdad de condiciones, un programador perezoso es mejor que uno que trabaja duro todo el tiempo –

Cuestiones relacionadas