Foros del Web » Programando para Internet » PHP »

Problemas con bloqueos de archivos

Estas en el tema de Problemas con bloqueos de archivos en el foro de PHP en Foros del Web. Hola a todos... Tengo un gran problema con un contador de visitas... pasa que estoy utilizando un archivo plano en el que voy registrando únicamente ...
  #1 (permalink)  
Antiguo 16/06/2004, 19:26
Avatar de kova  
Fecha de Ingreso: marzo-2003
Mensajes: 79
Antigüedad: 14 años, 8 meses
Puntos: 0
Pregunta Problemas con bloqueos de archivos

Hola a todos...

Tengo un gran problema con un contador de visitas... pasa que estoy utilizando un archivo plano en el que voy registrando únicamente la cantidad de visitas que voy teniendo, en realidad es algo bastante sencillo pero cada tanto el archivo que tiene el número falla y lo pierdo con lo que debo reiniciar todo el conteo.

Leí en algunos mensajes que tengo que utilizar la funcion flock para bloquear el archivo de modo que no se pisen los accesos al mismo cuando entren muchos usuarios a la vez.

Mi pregunta sería si tengo que hacer algo especial con la forma de leer el archivo y no solo con la escritura para que no falle o si alguien tiene el código para leerl y escribir un archivo con protección con bloqueos.
Se que con una BD no tendría problemas pero el servidor don debo alojar el sitio no brinda nigúna BD.

Espero que puedan contestarme y desde ya muchas gracias

Guillermo
  #2 (permalink)  
Antiguo 17/06/2004, 03:45
Avatar de Torus  
Fecha de Ingreso: enero-2002
Ubicación: Tú buscame y me encontraras
Mensajes: 413
Antigüedad: 15 años, 11 meses
Puntos: 0
Hola, lo mejor en estos casos es que nos digas si te da errores el script que tu estas ejecutando y que publicases el codigo ya que "a palo seco" yo por lo menos no se a lo que te refieres y por tanto no se que responderte.
Si entras en:
http://es2.php.net/manual/es/function.flock.php
veras un ejemplo de utilizacion de floc, te lo escribo mas abajo y te ahorro el esfuerzo Pero es una buena politica buscar en el manual de PHP.
Espero que te sea de utilidad
Código PHP:
<?
function safewrite($filename$data){
   
$rand microtime();
   
$rand md5($rand);
   
$temp fopen("temp/$rand""w");
   
fwrite($temp$data);
   
fclose($temp);
   
$otw fopen($filename"a+");
   if(
flock($otwLOCK_EX)){
       
ftruncate($otw0);
       if(!
fwrite($otw$data)) $err 1;
       
flock($otwLOCK_UN);
       
fclose($otw);
   } else {
       
$err 1;
   }
   if(
$err == || (filesize($filename) == && strlen($data) <> 0)){
       die(
"<b>There was an error while writing to $filename. Contact site administrator!</b>");
   } else {
       
unlink("temp/$rand");
   }
}
?>
__________________
Hay tanto que aprender y tan poco tiempo

Última edición por Torus; 17/06/2004 a las 03:48
  #3 (permalink)  
Antiguo 19/06/2004, 10:56
Avatar de kova  
Fecha de Ingreso: marzo-2003
Mensajes: 79
Antigüedad: 14 años, 8 meses
Puntos: 0
Pregunta Acá va el codigo

Como dije, el código que tengo es muy simple, tal vez puedan ayudarme si lo muestro como me aconceja Torus

$archivo = "datos.txt";
$contador = 0;

$fp = fopen($archivo,"r");
$contador = fgets($fp, 26);
fclose($fp);

++$contador;

$fp = fopen($archivo,"w+");
if (flock($fp, LOCK_EX)) { // do an exclusive lock
fwrite($fp, $contador, 26);
flock($fp, LOCK_UN); // release the lock
}
fclose($fp);


y luego muestro la variable $contador
  #4 (permalink)  
Antiguo 19/06/2004, 11:04
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 14 años, 2 meses
Puntos: 4
pues yo digo que usar tablas es una chulada, si tienes bdd de mysql no te la compliques, puedes definir una tabla para las estadisticas, ademas puedes incluir mas datos, como los datos del browser o USER_AGENT, la pagina de la que bino, la ip que uso, etc.
  #5 (permalink)  
Antiguo 20/06/2004, 09:07
Avatar de kova  
Fecha de Ingreso: marzo-2003
Mensajes: 79
Antigüedad: 14 años, 8 meses
Puntos: 0
Sigo sin poder asegurar el archivo

Se que con una Base de Datos podría hacer algo mucho mas completo, pero lo que necesito es únicamente ir guardando la cantidad de visitas realizadas a la web. Lo que no puedo corregir es el tema de los bloqueos porque me sigue arruinando el archivo de datos.

Alguien que me de una pista por favor
  #6 (permalink)  
Antiguo 20/06/2004, 14:02
Avatar de Torus  
Fecha de Ingreso: enero-2002
Ubicación: Tú buscame y me encontraras
Mensajes: 413
Antigüedad: 15 años, 11 meses
Puntos: 0
Hola cova:
he probado el script haciendo unos cambios y a mi me da resultado
Código PHP:
<? 
$archivo 
"datos.txt"
$contador 0

$fp fopen($archivo,"r");
$contador fgets($fp26);
fclose($fp); 

++
$contador

$fp fopen($archivo,"w+"); 
if (
flock($fp,2)) { 
fwrite($fp$contador26); 
flock($fp,3); 

fclose($fp); 
?>
Bien segun el manual de php
Cita:
Iniciado por ManualPHP
bool flock ( int fp, int operation)
flock() opera sobre fp el cual debe ser un apuntador a un fichero abierto. operation toma uno de los siguientes valores:
Para que adquiera un bloqueo compartido (lectura), fija operation a 1.
Para adquirir un bloqueo exclusivo (escritura), fija operation a 2.
Para liberar un bloqueo (compartido o exclusivo), fija operation a 3.
Si no quieres que flock() bloquee mientras está activado, suma 4 al valor de operation.
Espero que te sirva
Saludos
__________________
Hay tanto que aprender y tan poco tiempo
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 15:34.