¿Como creo un sistema de caché para reducir la carga del servidor?

srlemuuur Seguir

Gamma
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
2 Ene 2014
Mensajes
368
Buenos dias,

Resulta que tenemos un servidor con varias webs y que si en una entran X personas al dia y cada vez que entran tienen que cargar toda la web, slider, etc.. se carga el servidor, me han comentado que lo mejor es utilizar un sistema de cache, pero la verdad es que no se muy bien como desarrollarlo.

¿Sabéis de algún recurso o fuente de información para aconsejarme?

¿Que me recomendáis?

Gracias,
Un Saludo.
 

Gusty1980

Delta
Verificación en dos pasos activada
Desde
14 Ago 2011
Mensajes
617
Si usas wordpress hay plugins que puedes instalar como el Super Cache o el W3 total cache y listo, yo te recomiendo el Super Cache ya que no requiere ninguna configuración a diferencia del W3 total cache que para que funcione bien hay que configurarlo!
 

srlemuuur

Gamma
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
2 Ene 2014
Mensajes
368
Si usas wordpress hay plugins que puedes instalar como el Super Cache o el W3 total cache y listo, yo te recomiendo el Super Cache ya que no requiere ninguna configuración a diferencia del W3 total cache que para que funcione bien hay que configurarlo!


No uso wordpress, es todo codigo desde 0.
 

ramonjosegn

Sigma
Verificación en dos pasos activada
Verificado por Whatsapp
Desde
14 Feb 2010
Mensajes
70.591
No uso wordpress, es todo codigo desde 0.

Entonces vas a necesitar un CDN pienso yo...

También hay algunas órdenes que puedes usar para cachear en el navegador, reescribiendo el archivo htaccess

Pero los sistemas de caché llevan mucho tiempo hacerlos, y son muy complejos, incluso los plugins de Wordpress son bastante problemáticos en su mayoría

Por eso pienso que mejor uses un CDN o puedes usar Cloudflare, que tiene una opción gratuita
 
Última edición:

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
mi forma de realizar un sistema de cache para un portal que cree, fue la de generar archivos php donde voy guardando en una variable la serializacion de las consultas a la base de datos que hago, y lo que se va guardando ahi son los resultados de dichas consultas, de esta forma se crea el archivo la primera ves y luego se actualiza cada cierto tiempo (que lo configuras), haciendo que la carga se disminuya por que las consultas no los hace a la bd sino los trae del archivo que creaste para "cachearlo".
 

srlemuuur

Gamma
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
2 Ene 2014
Mensajes
368
mi forma de realizar un sistema de cache para un portal que cree, fue la de generar archivos php donde voy guardando en una variable la serializacion de las consultas a la base de datos que hago, y lo que se va guardando ahi son los resultados de dichas consultas, de esta forma se crea el archivo la primera ves y luego se actualiza cada cierto tiempo (que lo configuras), haciendo que la carga se disminuya por que las consultas no los hace a la bd sino los trae del archivo que creaste para "cachearlo".


Vicram eso suena muy, pero que muy interesante. Es una buena idea.


También una opción que estoy pensando es la de utilizar servidores externos de imagenes para soportar mis imagenes, es decir, las imagenes y iconos esenciales guardarlos en la web y las imagenes de las noticias y sliders subirlas a un servidor externo como por ejemplo imgur. De esta manera ya no estoy tirando de mi servidor... Ademas que creo que imgur tiene tirada para unos cuantos años despues de la gran inversion que han recibido.... Tambien si se va guardando las imagenes en droobox siempre que pase algo las tienes allí.

El problema principal son las imagenes.

¿Lo veis muy chapuzero?
 
Última edición:

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
Para las imagenes puedes ver un servicio cdn que creo hay algunos baratos o alojarlos en un servidor que nunca morira :witless:
Pero no esta nada mal la idea que tienes sobre las imagenes. Creeria que de si haces este tipo de optimizacion, estarias ahorrando mucho consumo y por ende, buenos resultados. :encouragement:
 

MorrisM

Dseda
Desde
16 Jul 2011
Mensajes
1.049
Es muy fácil. Aquí te va la base. Así lo uso en mi CMS.

OJO es un extracto y NO está probado este código.

Insertar CODE, HTML o PHP:
$cachetime = 7200; //tiempo de cache

	$cachefile = "cache/page/".$_GET[page].".page"; //Nombre del archivo


	if($isLogged==true) { //esto es para el admin (tendrás que crear una función que te diga si estás logeado)
		include("page.php");
		$cachethis = false;
	}
	else if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) { //aquí está la parte del tiempo y la actualización del cache
	    include($cachefile);
		die();
	}
	else {
			include("page.php");
			$cachethis = true;

	}

}


if(($cachethis==true)) { //valida si hay que crear cache
	$HTMLminificado = sanitize_output(ob_get_contents()); //aqui yo comprimo el HTML con una función (s
	$fp = fopen($cachefile, 'w');
	fwrite($fp,$HTMLminificado);
	fclose($fp);
}

Aqui la función para minificar el HTML

Insertar CODE, HTML o PHP:
function sanitize_output($buffer) {
    $search = array(
        '/\>[^\S ]+/s',  // strip whitespaces after tags, except space
        '/[^\S ]+\</s',  // strip whitespaces before tags, except space
        '/(\s)+/s'       // shorten multiple whitespace sequences
    );

    $replace = array(
        '>',
        '<',
        '\\1'
    );

    $buffer = preg_replace($search, $replace, $buffer);

    return $buffer;
}
 

ramonjosegn

Sigma
Verificación en dos pasos activada
Verificado por Whatsapp
Desde
14 Feb 2010
Mensajes
70.591
Última edición:

srlemuuur

Gamma
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
2 Ene 2014
Mensajes
368
Para las imagenes puedes ver un servicio cdn que creo hay algunos baratos o alojarlos en un servidor que nunca morira :witless:
Pero no esta nada mal la idea que tienes sobre las imagenes. Creeria que de si haces este tipo de optimizacion, estarias ahorrando mucho consumo y por ende, buenos resultados. :encouragement:

Gracias por los consejos!!! Creo que de momento usare imgur con un álbum privado, confió mucho en su servicio!

---------- Post agregado el 08-abr-2014 hora: 14:38 ----------

No conozco el servicio, pero precisamente esta mañana me topé este servicio
https://cloudinary.com/users/register/free

Cloudflare te protege el sitio web (tienes que modificar las DNS del dominio) y también incluye caché y protección

imgur es un servidor de subida de imágenes, que ha tomado fama por los memes, tiene una funcionalidad muy simple y es bastante rapido, ademas te permite editar, recortar y previsualizar imagenes ,etc...

Noticias relacionadas con imgur:

 

ramonjosegn

Sigma
Verificación en dos pasos activada
Verificado por Whatsapp
Desde
14 Feb 2010
Mensajes
70.591
No sé si han cambiado las políticas pero Imgur si no tienes x visitas en una imagen mensual, la eliminan!!
 

vicram10

Épsilon
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
8 May 2013
Mensajes
751
Edad
39
Te dejo un ejemplo, es muy cutre pero lo hice ahora para darte una idea a lo que me referia..

1. crea una carpeta en tu pc "ejemplo_cache"
2. dentro de la carpeta "ejemplo_cache" crea otra subcarpeta con el nombre "cache"
3. Crea la tabla "ejemplo_cache" en tu base de datos con la siguiente estructura

Insertar CODE, HTML o PHP:
-- phpMyAdmin SQL Dump
-- version 3.5.2.2
-- http://www.phpmyadmin.net
--
-- Servidor: 127.0.0.1
-- Tiempo de generación: 08-04-2014 a las 17:33:52
-- Versión del servidor: 5.5.27-log
-- Versión de PHP: 5.4.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de datos: `bd_laboratorio`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `ejemplo_cache`
--

CREATE TABLE IF NOT EXISTS `ejemplo_cache` (
  `id_registro` int(11) NOT NULL AUTO_INCREMENT,
  `titulo` varchar(250) NOT NULL,
  `contenido` text NOT NULL,
  PRIMARY KEY (`id_registro`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Volcado de datos para la tabla `ejemplo_cache`
--

INSERT INTO `ejemplo_cache` (`id_registro`, `titulo`, `contenido`) VALUES
(1, 'Titulo 1', 'Contenido del titulo 1'),
(2, 'Titulo 2', 'Contenido del titulo 2');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

4. crea un archivo index.php con el siguiente contenido

PHP:
<?php
global $cache;
//carpeta cache
$cache = 'cache';
$resultadoCacheado = false;
$connection = new mysqli('localhost','usuario bd','password bd', 'nombre base de datos'); //aca deben modificar acorde a sus datos de conexion a la BD y el nombre de BD
if ($connection->connect_errno) 
{
	echo "Fallo al conectar a MySQL: (" . $connection->connect_errno . ") " . $connection->connect_error;
}else{
	echo '<strong>Sistema de Cache PHP</strong>';
	echo '<br />';
	//vemos si existe el archivo
	$nombreArchivo = $cache.'/cache_ejemplo_cache.php';
	if (!file_exists($nombreArchivo))
	{
		$sql = $connection->query("select c.* from ejemplo_cache c");
		while($rows = mysqli_fetch_assoc($sql))
			$content[$rows['id_registro']] = array(
				'titulo' => $rows['titulo'],
				'contenido' => $rows['contenido'],
			);
		//cacheamos la primera ves que entramos
		cacheando($content, 'ejemplo_cache');
		$resultadoCacheado = false;
	}else{
		require_once($cache.'/cache_ejemplo_cache.php');
		$content = unserialize($valor); //la variable $valor se encuentra en al archivo
		$resultadoCacheado = true;
	}
	//impresion del resultado
	echo ($resultadoCacheado) ? 'El Vector ha sido Cacheado' : 'El Vector no ha sido Cacheado';
	echo '<br />';
	print_r($content);
}

//para crear el archivo php
function cacheando($vector, $nombrearchivo)
{
	global $cache;
	$serialize = serialize($vector);
	$contenido = '<?php $valor = \''. $serialize .'\'; ?>';
	$rutaArchivo = $cache.'/cache_'.$nombrearchivo.'.php';
	crearArchivoPHP($rutaArchivo, $contenido);
}

//para crear los archivos php
function crearArchivoPHP($filename, $contenido)
{
	//borramos el archivo
	if (is_file($filename))
		unlink($filename);
	//creamos el archivo
	$archivo = fopen($filename, 'w');
	//escribimos en el archivo
	fwrite($archivo, $contenido);
	fclose($archivo);
}
?>

Como dije es un ejemplo a lo que me refiero, es una base que puede ser modificada sin problema y agregar mas opciones como la expiracion automatica de los archivos y demas cosas..
 

srlemuuur

Gamma
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
2 Ene 2014
Mensajes
368
No sé si han cambiado las políticas pero Imgur si no tienes x visitas en una imagen mensual, la eliminan!!

En desarrolloweb comentan lo siguiente:

Cada imagen es alojada de forma ilimitada en los servidores de imgur mientras esta sea vista 1 vez cada 6 meses (caso contrario se elimina). No hay un límite en el número de imagenes que cada usuario puede subir aunque el peso máximo de cada una es de 10 Mb y los archivos soportados por este servicio son JPEG, GIF, PNG, APNG, TIFF, BMP, PDF y XCF (GIMP).

He decidido que los albums sean públicos, nos vienen bien esas visitas, el primero en subir(el de los sliders) ha alcanzado 500 visitas hoy..

---------- Post agregado el 08-abr-2014 hora: 22:51 ----------

Te dejo un ejemplo, es muy cutre pero lo hice ahora para darte una idea a lo que me referia..

1. crea una carpeta en tu pc "ejemplo_cache"
2. dentro de la carpeta "ejemplo_cache" crea otra subcarpeta con el nombre "cache"
3. Crea la tabla "ejemplo_cache" en tu base de datos con la siguiente estructura

Insertar CODE, HTML o PHP:
-- phpMyAdmin SQL Dump
-- version 3.5.2.2
-- http://www.phpmyadmin.net
--
-- Servidor: 127.0.0.1
-- Tiempo de generación: 08-04-2014 a las 17:33:52
-- Versión del servidor: 5.5.27-log
-- Versión de PHP: 5.4.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de datos: `bd_laboratorio`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `ejemplo_cache`
--

CREATE TABLE IF NOT EXISTS `ejemplo_cache` (
  `id_registro` int(11) NOT NULL AUTO_INCREMENT,
  `titulo` varchar(250) NOT NULL,
  `contenido` text NOT NULL,
  PRIMARY KEY (`id_registro`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Volcado de datos para la tabla `ejemplo_cache`
--

INSERT INTO `ejemplo_cache` (`id_registro`, `titulo`, `contenido`) VALUES
(1, 'Titulo 1', 'Contenido del titulo 1'),
(2, 'Titulo 2', 'Contenido del titulo 2');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

4. crea un archivo index.php con el siguiente contenido

PHP:
<?php
global $cache;
//carpeta cache
$cache = 'cache';
$resultadoCacheado = false;
$connection = new mysqli('localhost','usuario bd','password bd', 'nombre base de datos'); //aca deben modificar acorde a sus datos de conexion a la BD y el nombre de BD
if ($connection->connect_errno) 
{
	echo "Fallo al conectar a MySQL: (" . $connection->connect_errno . ") " . $connection->connect_error;
}else{
	echo '<strong>Sistema de Cache PHP</strong>';
	echo '<br />';
	//vemos si existe el archivo
	$nombreArchivo = $cache.'/cache_ejemplo_cache.php';
	if (!file_exists($nombreArchivo))
	{
		$sql = $connection->query("select c.* from ejemplo_cache c");
		while($rows = mysqli_fetch_assoc($sql))
			$content[$rows['id_registro']] = array(
				'titulo' => $rows['titulo'],
				'contenido' => $rows['contenido'],
			);
		//cacheamos la primera ves que entramos
		cacheando($content, 'ejemplo_cache');
		$resultadoCacheado = false;
	}else{
		require_once($cache.'/cache_ejemplo_cache.php');
		$content = unserialize($valor); //la variable $valor se encuentra en al archivo
		$resultadoCacheado = true;
	}
	//impresion del resultado
	echo ($resultadoCacheado) ? 'El Vector ha sido Cacheado' : 'El Vector no ha sido Cacheado';
	echo '<br />';
	print_r($content);
}

//para crear el archivo php
function cacheando($vector, $nombrearchivo)
{
	global $cache;
	$serialize = serialize($vector);
	$contenido = '<?php $valor = \''. $serialize .'\'; ?>';
	$rutaArchivo = $cache.'/cache_'.$nombrearchivo.'.php';
	crearArchivoPHP($rutaArchivo, $contenido);
}

//para crear los archivos php
function crearArchivoPHP($filename, $contenido)
{
	//borramos el archivo
	if (is_file($filename))
		unlink($filename);
	//creamos el archivo
	$archivo = fopen($filename, 'w');
	//escribimos en el archivo
	fwrite($archivo, $contenido);
	fclose($archivo);
}
?>

Como dije es un ejemplo a lo que me refiero, es una base que puede ser modificada sin problema y agregar mas opciones como la expiracion automatica de los archivos y demas cosas..


Gran trabajo, mañana a probarlo!!
 
Arriba