He estado trabajando recientemente en la optimización del rendimiento del programa y tengo una idea interesante que me gustaría compartir con ustedes.
El caché es un modo de aplicación típico de la estrategia "espacio por tiempo" y un método importante para mejorar el rendimiento del sistema. El uso de caché puede reducir en gran medida la cantidad de operaciones de bases de datos en el caso de grandes volúmenes de acceso, lo que reduce significativamente la carga del sistema y mejora el rendimiento del sistema. En comparación con el almacenamiento en caché de páginas, el conjunto de resultados es una especie de "datos sin procesar" que no contiene información de formato. La cantidad de datos es relativamente pequeña y se puede formatear nuevamente, por lo que es bastante flexible. Dado que PHP es un lenguaje de secuencias de comandos que "compila y ejecuta al mismo tiempo", también proporciona un método muy conveniente para utilizar el almacenamiento en caché del conjunto de resultados hasta cierto punto: utilizar el caché incluyendo dinámicamente el segmento de código de definición de datos correspondiente. Si se construye un caché en "RamDisk", la eficiencia debería mejorarse aún más. A continuación se muestra un pequeño código de muestra como referencia.
// cargar datos con caché
función load_data($id,$cache_lifetime) {
// los datos devueltos
$datos = matriz();
// crear nombre de archivo de caché
$cache_filename = 'cache_'.$id.'.php';
// comprueba la hora de la última modificación del archivo de caché
$cache_filetime = filemtime($cache_filename);
if (tiempo() - $cache_filetime <= $cache_lifetime) {
//** el caché no ha caducado
incluir($cache_filename);
} demás {
//** el caché ha caducado
// cargar datos desde la base de datos
//...
mientras ($dbo->nextRecord()) {
// $datos[] = ...
}
// formatea los datos como un archivo php
$caché_datos = "
mientras (lista($clave, $val) = cada uno($datos)) {
$data_cache .= "$datos['$clave']=array('";
$data_cache .= "'NOMBRE'=>"".qoute($val['NOMBRE'])."","
$data_cache .= "'VALOR'=>"".qoute($val['VALOR'])."""
$data_cache .= ";);rn";
}
$data_cache = "?>rn";
// guarda los datos en el archivo de caché
si ($fd = fopen($cache_filename,'w+')) {
fputs($fd,$data_cache);
fclose($fd);
}
}
devolver $datos;
}
?>
Situaciones aplicables:
1. Los datos son relativamente estables, principalmente operaciones de lectura.
2. Las operaciones con archivos son más rápidas que las operaciones con bases de datos.
3. Acceso a datos complejos, acceso a grandes volúmenes de datos, acceso intensivo a datos y carga extremadamente pesada en la base de datos del sistema.
4. Estructura de separación Web/DB o estructura de base de datos única multi-Web.
Pregunta no confirmada:
1. Si leer y escribir archivos durante el acceso simultáneo provocará problemas de bloqueo.
2. ¿Cuál es el rendimiento cuando hay demasiados archivos de datos involucrados?
Ideas de extensión:
1. Genere código de definición de datos JavaScript y llámelo en el cliente.
2. Aún no lo he pensado...
Espero discutir juntos.
cache
Si desea que su enorme aplicación PHP tenga un mejor rendimiento, utilizar el almacenamiento en caché también es una buena manera. Hay muchas soluciones de almacenamiento en caché disponibles, incluidas: Zend Cache, APC y Afterburner Cache.
Todos estos productos son "módulos de almacenamiento en caché". Cuando se produce por primera vez una solicitud de un archivo .php, guardan el código intermedio PHP en la memoria del servidor web y luego responden a solicitudes posteriores con la versión "compilada". Este enfoque realmente puede mejorar el rendimiento de la aplicación porque reduce el acceso al disco al mínimo (el código ha sido leído y analizado) y el código se ejecuta directamente en la memoria, lo que hace que el servidor responda a las solicitudes mucho más rápido. Por supuesto, el módulo de almacenamiento en caché también monitoreará los cambios en los archivos fuente de PHP y volverá a almacenar en caché la página si es necesario, evitando así que el usuario obtenga páginas que todavía se generan con código PHP desactualizado. Dado que los módulos de almacenamiento en caché pueden reducir significativamente la carga en el servidor y mejorar la eficiencia de respuesta de las aplicaciones PHP, son muy adecuados para sitios web con cargas pesadas.
Cómo elegir estos productos de almacenamiento en caché
Zend Cache es un software comercial de Zend Technologies, la empresa mencionada anteriormente que nos proporciona el motor PHP y Zend Optimizer gratuito. ¡Zend Cache es realmente bien merecido! Para páginas PHP grandes, puede sentir que la velocidad aumentará después de la primera ejecución y el servidor tendrá más recursos disponibles. Desafortunadamente, este producto no es gratuito, pero en algunos casos aún puede tener un gran valor.
Afterburner Cache es un módulo de almacenamiento en caché gratuito de Bware Technologies. Este producto se encuentra actualmente en versión Beta. Afterburner Cache se parece a Zend Cache, pero no mejora el rendimiento tanto como Zend Cache (todavía) y no funciona con Zend Optimizer.
APC es la abreviatura de Alternative PHP Cache, que es otro módulo de almacenamiento en caché gratuito de Community Connect. El producto ya es lo suficientemente estable para uso formal y parece mejorar en gran medida la velocidad de respuesta a las solicitudes.
Acerca de la compresión
El módulo gratuito de Apache mod_gzip de Remote Communications tiene la capacidad de comprimir contenido web estático para navegadores que admiten este tipo de codificación de contenido. Para la gran mayoría de contenido web estático, mod_gzip funciona muy bien. mod_gzip se puede compilar fácilmente en Apache y también se puede utilizar como DSO. Según Remote Communications, mod_gzip también puede comprimir contenido dinámico de mod_php, mod_perl, etc. Lo intenté una y otra vez, pero no pareció funcionar. He leído muchos foros y artículos sobre mod_gzip y parece que se espera que este problema se resuelva en la próxima versión de mod_gzip (probablemente 1.3.14.6f). Hasta entonces, podemos usar mod_gzip en las partes estáticas del sitio web.
Sin embargo, a veces realmente no queremos comprimir contenido dinámico, por lo que debemos encontrar otras formas. Una forma es usar class.gzip_encode.php, que es una clase PHP que se puede usar para comprimir el contenido de la página llamando a ciertas funciones de la clase al principio y al final del script PHP. Si desea implementar esta solución a nivel de sitio web, puede llamar a estas funciones desde las directivas auto_prepend y auto_append en el archivo php.ini. Aunque este método es eficaz, sin duda genera más gastos generales para los sitios web con mucha carga. Para obtener instrucciones detalladas sobre cómo utilizar esta clase, consulte su código fuente. La descripción de su código fuente es bastante completa y el autor te cuenta todo lo que necesitas saber.
PHP 4.0.4 tiene un nuevo controlador de caché de salida ob_gzhandler, que es similar a la clase anterior pero tiene un uso diferente. Se debe agregar el siguiente contenido a php.ini cuando se usa ob_gzhandler:
controlador_salida = ob_gzhandler;
Esta línea de código hace que PHP active el almacenamiento en caché de resultados y comprima todo lo que envía. Si por alguna razón no desea agregar esta línea de código a php.ini, también puede cambiar el comportamiento predeterminado del servidor (sin compresión) a través del archivo .htaccess en el directorio donde se encuentra el archivo fuente de PHP. es el siguiente:
php_value salida_handler ob_gzhandler
O llámelo desde código PHP, de la siguiente manera: ob_start("ob_gzhandler");
El método de utilizar identificadores de caché de salida es realmente muy eficaz y no supone ninguna carga especial para el servidor. Sin embargo, debe tenerse en cuenta que Netscape Communicator tiene un soporte deficiente para gráficos comprimidos, por lo que, a menos que pueda asegurarse de que todos los usuarios utilicen el navegador IE, debe desactivar los gráficos JPEG y GIF comprimidos. En general, esta compresión funciona para todos los demás archivos, pero se recomienda probarla por separado para cada navegador, especialmente si utiliza complementos o visores de datos especiales. Esto es especialmente importante.