Foros del Web » Programando para Internet » PHP »

Problema con contador

Estas en el tema de Problema con contador en el foro de PHP en Foros del Web. Hola, tengo hecho un contador de visitas en PHP pero me ha surgido un problema, el contador funciona estupendamente y va perfecto online, pero llega ...
  #1 (permalink)  
Antiguo 26/03/2010, 00:52
 
Fecha de Ingreso: diciembre-2007
Mensajes: 124
Antigüedad: 16 años, 4 meses
Puntos: 2
Problema con contador

Hola, tengo hecho un contador de visitas en PHP pero me ha surgido un problema, el contador funciona estupendamente y va perfecto online, pero llega un momento determinado, en que se pone a 0 y empieza a contar desde ahi, este momento es aleatorio y cada vez que pasa tengo que volver a ponerlo con la cantidad de visitas que más o menos tenia.

El código del contador es este:

Código:
<?
// Archivo en donde se acumulará el numero de visitas
$archivo = "visitas/contador.txt";

// Abrimos el archivo para solamente leerlo (r de read)
$abre = fopen($archivo, "r");

// Leemos el contenido del archivo
$total = fread($abre, filesize($archivo));

// Cerramos la conexión al archivo
fclose($abre);

// Abrimos nuevamente el archivo
$abre = fopen($archivo, "w");

// Sumamos 1 nueva visita
$total = $total + 1;

// Y reemplazamos por la nueva cantidad de visitas
$grabar = fwrite($abre, $total);

// Cerramos la conexión al archivo
fclose($abre);

// Imprimimos el total de visitas dándole un formato
echo "N&uacute;mero de visitas: ".$total;
?>
Y lo que hace es modificar un fichero txt con el total de visitas.

¿Que puede estar pasando?
  #2 (permalink)  
Antiguo 26/03/2010, 03:02
 
Fecha de Ingreso: marzo-2010
Ubicación: Barcelona
Mensajes: 657
Antigüedad: 14 años, 1 mes
Puntos: 26
Respuesta: Problema con contador

Yo pensava que fread nos devuelve un tipo String. No sé si haces la conversión y no la has puesto, pero si no es asi a lo mejor puede ser por ahi.

Supongo que no vuelves a abrir ni tocar el fichero en ningún otro sitio, si no que solo lo abres y escribes en este momento dado, no?
  #3 (permalink)  
Antiguo 29/03/2010, 01:09
 
Fecha de Ingreso: diciembre-2007
Mensajes: 124
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Problema con contador

No, solo lo toco ahi.

Como quedaría con la conversión hecha?
  #4 (permalink)  
Antiguo 29/03/2010, 01:30
 
Fecha de Ingreso: agosto-2005
Ubicación: Argentina, Capital Federal
Mensajes: 435
Antigüedad: 18 años, 8 meses
Puntos: 2
Respuesta: Problema con contador

El problema es el siguiente: los archivos no funcionan como las bases de datos; sin implementar mecanismos adicionales no tienes la garantía de que los datos no se corromperán si 2 usuarios están tratando de acceder al mismo recurso en el mismo momento.
Puedes hacer una prueba sencilla colocando un sleep(5) después de, por ejemplo, $abre = fopen($archivo, "w"); para generar un delay de 5 segundos. Aprovecha estos 5 segundos para abrir otra ventana de navegador e ingresar a la URL de tu script. Verás como el contador de visitas muestra cualquier cosa luego de estas operaciones.

Existe la función flock() que, tal como describe el manual, te serviría para bloquear el archivo y evitar que se corrompa. Por supuesto que la mejor solución sería optar por trabajar con una tabla de tu base de datos.

Saludos.
__________________
R4DS en español | R4DS en inglés
  #5 (permalink)  
Antiguo 29/03/2010, 01:56
 
Fecha de Ingreso: diciembre-2007
Mensajes: 124
Antigüedad: 16 años, 4 meses
Puntos: 2
Osea me creo una base de datos con una tabla donde almacene el numero de visitas y punto, pues no seria mala idea....

Sabes algun manual para leerme como realizar las llamadas oportunas en PHP?? Es que no manejo PHP, ese es el problema...

Vale ya he visto algo por la red, no es complicado.

Muchas gracias por la ayuda.

Saludos!

Última edición por GatorV; 29/03/2010 a las 08:25

Etiquetas: contador
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 10:49.