Pregunta

Para nuestro juego en línea, hemos escrito toneladas de clases y funciones PHP agrupadas por tema en archivos y luego carpetas.Al final, ahora tenemos todo nuestro código backend (capas lógicas y de acceso a la base de datos) en un conjunto de archivos que llamamos bibliotecas e incluimos nuestras bibliotecas en nuestra GUI (páginas web, capa de presentación) usando include_once('rutaalib/archivo.inc').

El problema es que hemos sido flojos con las inclusiones y la mayoría de las declaraciones de inclusión se realizan dentro de nuestro archivo libs, lo que resulta en que desde cada página web, cada vez que incluimos cualquier archivo libs, en realidad cargamos las bibliotecas completas, archivo por archivo.

Esto tiene un impacto significativo en el rendimiento.Por tanto, ¿cuál sería la mejor solución?

  • ¿Eliminar todas las declaraciones de inclusión del archivo libs y llamar solo a la necesaria desde las páginas web?
  • Hacer algo más ?

El servidor utiliza una pila LAMP clásica (PHP5).

EDITAR:Tenemos una combinación de funciones simples (razones heredadas y la mayor parte del código) y clases.Entonces la carga automática no será suficiente.

¿Fue útil?

Solución

  • Administre todas las inclusiones manualmente, solo cuando sea necesario
  • Configure su include_path solo donde tiene que estar, el valor predeterminado es algo así como .:/usr/lib/pear/:/usr/lib/php, apúntelo solo donde tiene que estar, php.net/set_include_path
  • No utilice la carga automática, es lenta y dificulta mucho los trabajos de APC y cachés equivalentes.
  • Puede desactivar la operación "stat" en APC, pero luego tendrá que borrar el caché manualmente cada vez que actualice los archivos.

Otros consejos

Si ha realizado su programación de forma orientada a objetos, puede hacer uso del carga automática función, que cargará clases desde sus archivos fuente a pedido a medida que las llame.

Editar:Noté que alguien rechazó ambas respuestas que se referían a la carga automática.¿Estamos equivocados?¿La sobrecarga de la función __autoload es demasiado alta para usarla con fines de rendimiento?Si hay algo de lo que no me doy cuenta sobre esta técnica, me interesaría mucho saber qué es.

Si desea ser realmente duro, haga un análisis estático y averigüe exactamente qué bibliotecas se necesitan y cuándo, e inclúyalas solo.

Si utiliza include y no include_once, entonces también hay un pequeño ahorro de velocidad.

Dicho todo esto, la respuesta de Matt sobre Zend Optimizer es acertada.Si lo desea, pruebe el caché PHP avanzado (APC), que es un caché de código de operación y es gratuito.Debería estar en el repositorio de PECL.

Puede usar spl_autoload_register() o __autoload() para crear las reglas que necesite para incluir los archivos que necesita para las clases; sin embargo, la carga automática introduce sus propios gastos generales de rendimiento.Deberá asegurarse de que todo lo que utilice esté antepuesto a todas las páginas de la interfaz gráfica de usuario utilizando una configuración de php.ini o una configuración de Apache.

Para sus archivos con funciones genéricas, le sugeriría que los incluya en una clase de utilidad y realice una simple búsqueda y reemplazo para reemplazar todas sus llamadas a función() con util::function(), lo que luego le permitiría cargar automáticamente estas funciones. (Nuevamente, se introduce una sobrecarga al llamar a un método en lugar de a una función global).

Básicamente, lo mejor que puedes hacer es revisar tu código y pagar tu deuda de diseño solucionando los problemas de inclusión.Esto le brindará el mayor beneficio de rendimiento y le permitirá aprovechar al máximo optimizadores como eAccelerator, Zend Platform y APC.

Aquí hay un método de muestra para cargar cosas dinámicamente.

public static function loadClass($class)
{
    if (class_exists($class, false) ||
        interface_exists($class, false))
    {
        return;
    }

    $file = YOUR_LIB_ROOT.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';

    if (file_exists($file))
    {
        include_once $file;
        if (!class_exists($class, false) &&
            !interface_exists($class, false))
        {
            throw new Exception('File '.$file.' was loaded but class '.$class.' was not found');
        }
    }
}

Lo que buscas es Extensión PECL de asignación automática.

Básicamente, permite la carga automática con solo una pequeña sobrecarga de cargar un archivo de mapa precalculado.También puede subdividir el archivo de mapa si sabe que un directorio específico solo extraerá ciertos archivos PHP.

Puedes leer más sobre esto. aquí.

Ha pasado un tiempo desde que usé php, pero ¿no deberían ayudar Zend Optimizer o Cache en este caso?¿php todavía carga y compila todos los archivos incluidos nuevamente para cada solicitud?

No estoy seguro de si la carga automática es la respuesta.Si estos archivos están incluidos, probablemente sean necesarios en la clase que los incluye, por lo que se cargarán automáticamente de todos modos.

Utilice un caché de código de bytes (idealmente APC) para que PHP no necesite analizar las bibliotecas en cada carga de página.Tenga en cuenta que el uso de la carga automática anulará los beneficios de utilizar un caché de código de bytes (puede leer más sobre esto aquí).

Usar una perfilador.Si intentas optimizar sin tener medidas, estás trabajando a ciegas.

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