Foros del Web » Programando para Internet » PHP »

armando un buscador de la muerte... ¿me ayudan con un detalle?

Estas en el tema de armando un buscador de la muerte... ¿me ayudan con un detalle? en el foro de PHP en Foros del Web. Que tal? Estoy programando un buscador, por el momento es super simple, pero el problema que presenta ya de 'recien nacido' es que, una vez ...
  #1 (permalink)  
Antiguo 11/04/2006, 22:32
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
De acuerdo armando un buscador de la muerte... ¿me ayudan con un detalle?

Que tal?

Estoy programando un buscador, por el momento es super simple, pero el problema que presenta ya de 'recien nacido' es que, una vez que genero una "Lista de items encontros" (los cuales c/u conforma un LINK hacia una pagina), si visito una de las PAGINAS ENCONTRADAS, cuando le doy "Volver" (history.back();) me tira el famoso y molesto cartelete de:

"La pagina ha caducado, ¿postear otra vez los datos?"

ASÍ MISMO, si le doy aceptar, cuando vuelvo a la lista de encontrados estoy realizando UNA NUEVA CONSULTA, con la misma info... lo que multiplicado por muchos usuarios es = a cientas de consultas realizadas = a pagar más plata a mi servidor :P (todavia soy pobre, es solo por eso ^_^)


Mi idea de solucion perfecta:

¿Es dificil crear una PAGINA HTML con el output del .php y que despues de determinado tiempo caduque (se borre)? Asi todo el material seria dinamico y no estaria re-haciendo consultas ni necesitando RE-POSTEAR datos.

Bueno, a ver que dicen... desde ya, MIL gracias a quien me pueda dar una mano :)))

edu.
  #2 (permalink)  
Antiguo 11/04/2006, 22:52
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 10 meses
Puntos: 834
Esto puede ayudarte:
http://www.programacion.com/php/articulo/gueb_cache/
  #3 (permalink)  
Antiguo 12/04/2006, 00:41
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
lo voy a ver bien en detalle, aunque a un primer vistazo veo que usa GLOBALS y eso a mi no me sirve :S

GRACIAS!
  #4 (permalink)  
Antiguo 12/04/2006, 15:00
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
GENIOOOOOOOOOOOOO PANINOOOO

Es exactamente lo que necesito!!!!!!!

GRACIAS TOTALES! :):):):)
  #5 (permalink)  
Antiguo 13/04/2006, 01:45
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Pues a mí me gusta más otro método para el mismo efecto.

Mira, lo que pasa es que cuando regresas el menú y te pide repostear es porque no le estás permitiendo al usuario cachear el contenido, por lo tanto desperdicias ancho de banda y más importante, fastidias a tus usuarios.

La solución y recomendación incluso del propio Google consiste en saber utilizar la cabecera IF-MODIFIED-SINCE, con ello logras varias cosas:

- Le permites a tus usuarios cachear el contenido dinámico por el tiempo que tú quieras (5 minutos, 24 horas, lo que sea).

- Cuando el usuario haga la misma consulta o bien, click en regresar, el contenido se carga inmediatamente, pues no se pide nada al servidor, ¿me explico? Ya lo tiene cacheado por el tiempo que tú indiques.

- Cuando se vence el tiempo, es decir, caduca el contenido, se solicitará nuevamente la búsqueda al servidor, pero ojo aquí y es la bondad de esta cabecera, el cliente al solicitar nuevamente los datos, como ya tiene previamente una copia y se le caducó, ahora va a solicitar nuevamente el contenido pero junto con una cabecera llamada IF-MODIFIED-SINCE (lo hace cualquier navegador) que le dice al servidor la fecha de última carga.

Ahora, el servidor checa si el contenido no ha cambiado y si no ha cambiado, le manda un bonito 304 Not Modified, con lo cuál NO SE VUELVE A CARGAR EL CONTENIDO Y LE DAS UNA NUEVA FECHA DE CADUCIDAD (si el contenido sí ha cambiado, entonces le manda un 200 Ok y le manda el contenido nuevo).


¿POR QUÉ LO RECOMIENDA GOOGLE?

Precisamente
para ahorrar ancho de banda y sobre todo porque irá más profundo en tu web, ya que Google no tiene que escombrar tu web completa nuevamente para saber si ha habido modificaciones, sino que Google, como usa la cabecera IF-MODIFIED-SINCE al igual que los navegadores, es literalmente AVISADO de si las páginas que visita han cambiado o no. Así, sólo entrará en las páginas que no tengan cambios y tendrá accesos más profundos en tu web.

No he visto muy buenos tutoriales sobre la cabecera IF-MODIFIED-SINCE, pero ahí te dejo la info por si te gustan los retos y planeas ser el mejor amigo de Google, jejee, esto último es broma.

Saludos !
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #6 (permalink)  
Antiguo 13/04/2006, 20:31
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
UAMISTAD: Ni hablar. Esto me ahorra mucho más que el script para cachear (Aunque igualmente al otro ya le di uso jeje).

Me pongo ya mismo a buscar info al respecto, te agradezco mucho por tu respuesta tan completa!!! :):)

SALUDOS
  #7 (permalink)  
Antiguo 13/04/2006, 21:09
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
Bueno todo va bien con el ejemplo UAMISTAD. Encontre en el manual de PHP.NET un script para hacer el trabajo, pero tengo un pequeño problema...

El script trabaja utilizando la funcion: filemtime(); y si PHP esta trabajando en SAFE_MODE, no permite acceder utilizar la funcion...

Primero lo primero, las funciones:
(Esto en la primera seccion del script)

Código PHP:
function get_http_mdate()
{
   return 
gmdate("D, d M Y H:i:s",filemtime('/foros/forum_buscar.php'))." GMT";
}

function 
check_modified_header()
{
   
// This function is based on code from http://ontosys.com/php/cache.html

   
$headers=apache_request_headers();
   
$if_modified_since=preg_replace('/;.*$/'''$headers['If-Modified-Since']);
   if(!
$if_modified_since)
       return;

   
$gmtime=get_http_mdate();

   if (
$if_modified_since == $gmtime) {
       
header("HTTP/1.1 304 Not Modified");
       exit;
   }
}

check_modified_header();
header("Last-Modified: ".get_http_mdate()); 
Y cuando cargo mi buscador, aparece este hermoso cartelito de error:

Warning: filemtime(): SAFE MODE Restriction in effect. The script whose uid is 2189 is not allowed to access / owned by uid 0 in /webcp/docs/webs/7645023445/test/foro/buscar.php on line 5

¿De que otra forma alternativa puedo tomar ese dato de TIEMPO que necesito para que la funcion pueda calcular utilizando IF-MODIFIED-SINCE ?

¿Tal vez alguna alternativa a filemtime() ?

MUCHAS GRACIAS
  #8 (permalink)  
Antiguo 13/04/2006, 22:03
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Órale, qué buen código te encontraste !!

Ahorita ando haciendo un foro y lo que cambia son los datos de la base de datos, por lo tanto tengo que almacenar en la DB la fecha de última modificación y de ahí la tomo cuando la necesito.

Pero toda la tarde he tenido ese problema en la cabeza, el que tú encontraste, pues otras páginas también son dinámicas pero no tienen que ver con bases de datos y me interesaba encontrar esa fecha y andaba pensando en dónde almacenarla, pero ¡es cierto!, no se necesita almacenar, sino encontrando la fecha de última modificación del archivo.php es suficiente.

Pero ese mensaje que te salió me suena a malas noticias, ¿será que un archivo extensión PHP no puede checarse a sí mismo su tamaño?

¿O te sale el mensaje para cualquier archivo? ¿Intentaste por ejemplo con .jpg, .gif etc?

Gracias por la idea, =)
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #9 (permalink)  
Antiguo 13/04/2006, 22:09
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
A propósito, en lugar de:

Código PHP:
//
$headers=apache_request_headers();
    
$if_modified_since=preg_replace('/;.*$/'''$headers['If-Modified-Since']); 
Se me hace más práctico usar:
Código PHP:
//
$_SERVER['HTTP_IF_MODIFIED_SINCE'
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #10 (permalink)  
Antiguo 14/04/2006, 01:29
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Regreso compa !

Estoy mega feliz, ese filemtime() vino a resolver mi vida, con decirte que de tan contento no he podido (querido) dormir haciendo experimentos.

Ahora a cada uno de mis archivos le puse la función:

cacheando("index.php"); (ese index.php es un ejemplo) y se lo pongo a todos mis archivos PHP al iniciar el código.

Y la función la construí así:

Código PHP:
//
function cacheando($archivo){
             
$ultima_modificacion "";
             if(
file_exists($archivo)){

                  
//lo convierto a GMT (Mexico City)
                  
$timestamp_modif filemtime($archivo)+6*60*60;

                  
//lo ponemos en un string
                  
$ultima_modificacion date("D, d M Y H:i:s",$timestamp_modif)." GMT";
                 }
//end file_exists

             //si el archivo no existe, mensaje de error
             
else mensaje_final('badcache2');
             
            
//si cabecera contiene una fecha y es igualita a la proporcionada
            
if($ultima_modificacion == $_SERVER['HTTP_IF_MODIFIED_SINCE']){
                 
//header("Location: http://www.google.com");
                 //exit;
                 
header("HTTP/1.1 304 Not changed");
                 exit;
                }
//end if

             
header("Cache-Control: max-age=0, must-revalidate");
             
header("Pragma: no cache");
             
header("Last-Modified: $ultima_modificacion");
}
//end function 
Esos renglones:

//header("Location: http://www.google.com");
//exit;

Los descomento para saber que efectivamente funciona. Si carga una página y al darle click en actualizar me redirecciona a Google, es que funciona.

Thanks compa !
__________________
"Di no al Internet Explorer" -Proverbio Chino-

Última edición por uamistad; 18/04/2006 a las 02:07
  #11 (permalink)  
Antiguo 14/04/2006, 01:39
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
Weno que alegría que te haya servido!!

Yo pense lo mismo, una vez que vi esa funcion automaticamente empezaron a germinar en mi cabeza la cantidad de funcionalidades que le podia dar... ahora me parece que termino cacheando toda mi web como hiciste vos jajaja (es genial!) :)

Mi problema es que no me deja "LEER" el filemtime(), no se por que pero no me da acceso de lectura a esa funcion cuando esta el servidor configurado en SAFE_MODE 1... ya hablare con los de soporte a ver que me dicen...

Aprovecho para consultarte... ya que estas haciendo un foro.

¿Como resolviste vos el problema de presentar dentro de una DIV el texto ingresado en un TEXTAREA por el usuario cuando escribe un mensaje?

(Ya que si el texto que el usuario ingresa es mucho más largo que el de la div donde lo presentas, hace overflow).

Estoy luchando hace mucho con esto y me esta costando una patada...

Saludos!
  #12 (permalink)  
Antiguo 14/04/2006, 02:34
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
No le pongas height a tu div. Crecerá solito hasta acomodarse, =)

Uyyy qué mal con tu problema de filemtime(), si no vas a tener que meterlos en un .txt y leerlos de ahí, o cambiarte de hosting, jeje.
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #13 (permalink)  
Antiguo 14/04/2006, 02:52
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
jajajaja

Si, algo de eso hare, no creo que haya problema! :)

Con respecto a lo otro... yo te digo del overflow HORIZONTAL.

Proba en el TEXTAREA donde ingresas el texto de nuevo mensaje, por ejemplo:

Apreta una tecla, y dejala apretada... deja que se cree una linea LARGA, cuando supere el ancho del TEXTAREA, te aparecera un scrollbarr horizontal...

Cuando tengas una linea suficientemente larga, supongamos, 200 caracteres, dale click a tu botoncito de enviar y checa como se ve eso...
  #14 (permalink)  
Antiguo 14/04/2006, 03:05
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Jaja, según yo tengo todo controlado pero es cierto, se salió de control. Y no va a faltar el usuario ojete que lo haga.

Se me ocurre que podría meterse una exprexión regular que detecte muchos caracteres sin al menos un espacio, ¿cómo ves?

Yo estoy validando desde Javascript y por si las dudas, también desde PHP.

Por decir para 60 caracteres máximo sin espacios podría hacerse en PHP:

if ( ereg("[^ ]{60,}",$mensaje) ){
//overflow horizontal
}

¿Cómo ves esa?
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #15 (permalink)  
Antiguo 14/04/2006, 13:21
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
Hm... no se por que pero me gusta más la idea de formatearlo al texto. Pensa que el usuario lo puede hacer por "error" eso tambien, y es mejor que no se entere de nada y que vea su mensaje magicamente posteado... sin saber si se lo formateo o no.

Voy a seguir viendo si puedo hacer andar BIEN esa funcion... el unico problema que tiene es que si pones, por ejemplo, dos "\n" al final, uno se lo come.

Ejemplo:

"...y asi concluyo mi redaccion.\n
\n
Atte. Gilberto Gomez\n";

Lo imprimie:

"...y asi concluyo mi redaccion. Atte. Gilberto Gomez";

En cuanto tenga una nueva version la posteo aqui asi la podes ver, modificar, usar, etc.

SALUDOS!
  #16 (permalink)  
Antiguo 14/04/2006, 13:27
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
Perdon, me olvide de la funcion para el texto, probala:

Código PHP:
        $texto "Texto largo que es realmente largo por que necesita ser suficientemente largo como para ser largamente procesado por la funcion\n
que hice para controlar los textos te extensa longitud, tales como:\neste\naquel\naquelotro\nEspero que este texto haya sido suficientemente largo.\n\n
\natte. Largo\n"
;
    
$nuevo_texto "";

    
$limit 90;
    
$counter 0;

/** aca empieza la funcioneta **/

    
for ($i 0$i <= strlen($texto); $i++) {
        
$counter++;

        if (
$counter == $limit && $texto[$i] != "\n") {

            
$nuevo_texto.= $texto[$i]."\n";
            
$flag 1;
            
$counter 0;

        } else if (
$counter $limit && $texto[$i] == "\n" && $flag == 1) {

            
$nuevo_texto.= " ";
            
$flag 0;

        } else if(
$counter $limit && $texto[$i] == "\n") {

            
$nuevo_texto.= $texto[$i];
            
$counter 0;

        } else {

            
$nuevo_texto.= $texto[$i];
        }
    } 
Fijate que la cuestion una vez que se tiene la funcion andando es ajustar el "$limit" en proporcion a la cantidad de caracteres que entra en tu <textarea>, el cual tambien debe estar ajustado a la cantidad de caracteres que entran en tu DIV (o TD) por donde mostras el mensaje en el foro.

Un saludo, contame que onda con la funcion.
  #17 (permalink)  
Antiguo 14/04/2006, 14:30
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Mmm... y por qué no le pones cada 90 caracteres de línea contínua un espacio, así solito se insertará en la parte inferior el siguiente texto sin tener que usar el "\n" ?


Así, un texto largo como este y con un límite de 30:

01234567890123456789012345678901234567890123456789 01234567890123456789

Se vería ahora así:
012345678901234567890123456789
012345678901234567890123456789
01234567890
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #18 (permalink)  
Antiguo 14/04/2006, 14:38
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
Tenes razon... ¿El resultado de la funcion agregando un "\n" es diferente al que tendria con un espacio decis?

Ahora la estoy implementando en mi foro y esta funcionando... el problema que resulta ahora es que no ocupan el mismo WIDTH 90 caracteres "i" que 90 caracteres "4" por ejemplo. Si la cadena de 90 caracteres tiene muchos caracteres "pequeños" se corta antes, y el espacio que queda vacio es realmente MUY grande :S

Quiza agregando un ESPACIO como vos decis sería más conveniente... ya lo pruebo y te cuento.
  #19 (permalink)  
Antiguo 14/04/2006, 14:45
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
Si... funciona de maravillas ahora.

Solo corta FEO una l PALABRA es demasiado larga (+ del limite). Lo demas lo acomoda perfectamente. Osea, es el caso en el que sea intencional

Me gustaria probar como funciona eso en ESTE foro... hagamos una prueba abajo:

Minusculas:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Mayuscula:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAA

La corto mucho antes........ no se ya estoy mareado... espero que alguien que sepa como se hace BIEN esto entre a este thread y nos tire un hueso :P

Última edición por jam1138; 18/04/2006 a las 05:28
  #20 (permalink)  
Antiguo 14/04/2006, 15:01
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 meses
Puntos: 2
Otra idea:

Una funcion que recorra el string... que reconosca PALABRAS (osea, strings encerradas entre dos " "..." ".

(Cuando encuentra un espacio $flag_inicio = 1;)

Si cuenta "90" veces más antes de encontrar nuevamente un espacio, entonces
mete uno y reinicia el contador de "palabra ($flag_inicio = 0;)

Y todo asi...... de esta forma se puede poner un "$limite" mucho más corto (como el que aparenta tener este foro), permitiendo que los textos salgan normalmente, y si alguno se hace el loquito que le corte las piernas :P


La intentare programar y te la paso... si funciona puede reemplazar a la otra ya que seria más eficiente.
  #21 (permalink)  
Antiguo 17/04/2006, 03:58
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Para esa función de limitar el tamaño de las cadenas, se puede usar una función como la siguiente, le pasas la cadena completa y el límite que quieres para cortar:

Código PHP:
<?
$cadena_larga 
"012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
echo 
limpia_cadenas($cadena_larga,20);

//esta función checa si hay muchos caracteres sin espacios e inserta espacios.
function limpia_cadenas($cadena,$max){
     
$patron '([^ ]{'.$max.'})';
     
$reemplazo "\\1 "//lo mismo más un espacio
     
$cadena_limpia ereg_replace($patron,$reemplazo,$cadena);
     return 
$cadena_limpia;
    }
?>
Aunque no tendría sentido cortar cadenas que tienen, aunque cumplan con el máximo que tú quieres, ya tengan saltos de línea. Es decir, la función esa, para estar completa, debe identificar cadenas corridas en donde no haya espacios ni saltos de línea. Por ahora así está.

La función anterior imprime:

01234567890123456789 01234567890123456789 01234567890123456789 01234567890123456789 01234567890123456789 01234567890123456789
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #22 (permalink)  
Antiguo 19/04/2006, 05:12
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
CORRECCIÓN DE UN BUG DE LA FUNCIÓN


ENCONTRÉ UN ERROR EN UNA FUNCIÓN QUE PUSE ARRIBA Y QUE LLAMÉ cacheando() y escribo este post para corregirlo.

Lo que sucede es que cuando se solicitaba la página nuevamente, la función enviaba efectivamente un código 304, PERO no se enviaba nuevamente, junto con ese 304, EL DATO DE LAST-MODIFIED, puesto que la cabecera de LAST-MODIFIED la puse después de que envié el 304 y di exit.

Como resultado de ese error, sólo se envía un 304 la primera vez, pero si se solicita muchas veces más el documento, se enviará la información de last-modified una vez sí y una vez no, alternándose.

El bug se solucionan poniendo la cabecera de LAST-MODIFIED siempre, se envíe o no el código 304. Basta con ponerlas antes de de que llame al segundo IF.

Código PHP:
//
function cacheando($archivo){
             
$ultima_modificacion "";
             if(
file_exists($archivo)){

                  
//lo convierto a GMT (Mexico City)
                  
$timestamp_modif filemtime($archivo)+6*60*60;

                  
//lo ponemos en un string
                  
$ultima_modificacion date("D, d M Y H:i:s",$timestamp_modif)." GMT";
                 }
//end file_exists

             //si el archivo no existe, mensaje de error
             
else mensaje_final('badcache2');


             
header("Cache-Control: max-age=0, must-revalidate");
             
header("Pragma: no cache");
             
header("Last-Modified: $ultima_modificacion");

             
            
//si cabecera contiene una fecha y es igualita a la proporcionada
            
if($ultima_modificacion == $_SERVER['HTTP_IF_MODIFIED_SINCE']){
                 
//header("Location: http://www.google.com");
                 //exit;
                 
header("HTTP/1.1 304 Not changed");
                 exit;
                }
//end if
}//end function 
Sólo lo dejo por si alguien lee esto en el futuro.

AHORA SÍ, POR MÁS QUE SE LE PIQUE "F5" EL DOCUMENTO CARGARÁ CASI INSTANTÁNEAMENTE, PUES EL SERVIDOR, AL SABER QUE EL DOCUMENTO NO HAY CAMBIADO, SE NEGARÁ ROTUNDAMENTE A ENVIARLO DE NUEVO Y LE PEDIRÁ AL NAVEGADOR QUE LO TOME DE SU CACHÉ.
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #23 (permalink)  
Antiguo 19/04/2006, 05:51
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
Versión Mejorada

Y en este POST, una versión mejorada de el anterior.

Notar que hay una parte en donde tengo que agregar 21600 segundos, es decir, le aumento 6 horas porque vivo en en México y aquí estamos en la hora GMT -06.

Para el efecto inverso (cuando el navegador envía la cabecera IF-MODIFIED-SINCE) la función strtotime() automáticamente resta esas 6 horas y la convierte en UNIX timestamp (toma eso en cuenta si tu servidor no tiene la misma hora de tu país).

Código PHP:
<?
//
function cacheando($archivo){
             
$ultima_modificacion "";

             if(
file_exists($archivo)){
                  
$timestamp_archivo filemtime($archivo);
                 }
//end file_exists
             
else mensaje_final('badcache2'); //archivo no existe

             //convertimos la cabecera del navegador a UNIX Time Stamp para comparar
             
$timestamp_navegador strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);

             
//colocamos estas cabeceras SIEMPRE y antes de mandar o no el 304
             
header("Cache-Control: max-age=0, must-revalidate");
             
header("Pragma: no cache");
             
header("Last-Modified: ".date("D, d M Y H:i:s",$timestamp_archivo 21600)." GMT"); //21600 segundos = 6 hrs. (por ser Mexico City)

            //si las fechas son idénticas (navegador y servidor)
            
if($ultima_modificacion == $timestamp_navegador){
                 
header("HTTP/1.1 304 Not changed");
                 exit;
                }
//end if
}//end function
?>
Un saludo !
__________________
"Di no al Internet Explorer" -Proverbio Chino-
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 13:29.