Seguridad de Contador PHP y Accesso Concurrente

  • Autor Autor RichardBit
  • Fecha de inicio Fecha de inicio
RichardBit

RichardBit

Beta
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Hola amigos, tengo este script que lleva el conteo de las veces que una página se ha visitado.

Pero me pregunto si el archivo donde se guarda el conteo se puede corromper, si varios usuarios acceden a la página al mismo tiempo, es decir cuando se llama a la función fwrite() simultáneamente sobre el mismo fichero. Gracias de antemano.

<?
$archivo = "contador.txt";
$contador = 0;

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

++$contador;

$fp = fopen($archivo,"w+");
fwrite($fp, $contador, 26);
fclose($fp);

echo "Esta página se ha visitado $contador veces";
?>

Actualizado: Eviten usar este contador, el archivo si puede corromperse.
 
Última edición:
Yo he usado ese mismo codigo jeje, no lo use en blogs de muchas visitas asi que no sabriadecirte, pero puedes probar y contarnos
 
Hola amigos, estoy aprendiendo a programar en php, y tengo este script que lleva el conteo de las veces que una página se ha visitado.

Pero me pregunto si el archivo donde se guarda el conteo se puede corromper, si varios usuarios acceden a la página al mismo tiempo, es decir cuando se llama a la función fwrite() simultáneamente sobre el mismo fichero. Gracias de antemano.

<?
$archivo = "contador.txt";
$contador = 0;

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

++$contador;

$fp = fopen($archivo,"w+");
fwrite($fp, $contador, 26);
fclose($fp);

echo "Esta página se ha visitado $contador veces";
?>

Hola [MENTION=18514]RichardBit[/MENTION],

Pongamos un ejemplo. Son las 12:00 AM y tu en tu país, suponiendo que no eres de España, y yo desde España abrimos el navegador a la vez y tenemos google como página de inicio. Entramos JUSTO a la vez, ¿Google te rechaza el servicio a ti o a mi? La respuesta es no, lo mismo pasa al sobreescribir el fichero.

El servidor trabaja simultáneamente con las visitas que va recibiendo.

Un saludo,
Ángel.
 
Mira aqui puedes ver este que te identifica la ip y asi no te da tantas visitas fantasmas, ademas de que usas mysql y te da mas dinamismo..
Enlace eliminado

Saludossssssssssssssssssssssssssss
 
Si ... si entran al mismo tiempo uno cargara el archivo y el otro tambien creando un pequeño tmp(archivo temporal) para trabajar en el, si guarda uno y despues el otro, se pierde informacion del primero que guardo reemplazandolo con el nuevo, lo que se puede hacer es que si esta en uso bloquear el archivo para el script, En fin no recomiendo para nada el uso de txt, tiene varias vulnerabilidades a tu servidor ademas de que el contenido ahi se podria editar, Recomiendo por mucho uso de bases de datos :encouragement:
 
La escritura de archivos se basa en un buffer, este abre el archivo y lo edita en unas milésimas de segundos, aun cuando otro usuario entre en la misma milésima se guardará detrás del mismo buffer, incluso sería más rápido el guardado si entran 1500 personas en la misma milésima que todos separados. De todos modos te aconsejaría que uses más php+mysql para el conteo de visitas ya que podrías guardar información relevante para la toma de decisiones.

Un ejemplo burdo...

Guardar información como

Ip, fecha visita, referer (desde donde proviene), Pais (necesitarías una función que la obtenga), cantidad de visitas de la misma ip.

Te adjunto las funciones por si te animas o por si alguien que revisa el post las requiriese.

Insertar CODE, HTML o PHP:
function obtener_pais($ip_address)
	{
		$url = "http://ip-to-country.webhosting.info/node/view/36";
		$inici = "</b> belongs to <b>";
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_POST,"POST");
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, "ip_address=$ip_address"); 

		ob_start();
		
		curl_exec($ch);
		curl_close($ch);
		$cache = ob_get_contents();
		ob_end_clean();
		
		$resto = strstr($cache,$inici);
		$pais = substr($resto,strlen($inici),30);
		$pais=strstr($pais, '</b>', true);
		
		return $pais;
   }

Insertar CODE, HTML o PHP:
function obtener_ip() 
	{
		if (!empty($_SERVER['HTTP_CLIENT_IP']))
			return $_SERVER['HTTP_CLIENT_IP'];
		   
		if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
			return $_SERVER['HTTP_X_FORWARDED_FOR'];
	   
		return $_SERVER['REMOTE_ADDR'];
	}

Insertar CODE, HTML o PHP:
function obtener_referer()
	{
		if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
			{
			$domain=gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']);
			}
		else
			{
			$domain=gethostbyaddr($_SERVER['REMOTE_ADDR']);
			}
		return $domain;
	}

Además, te recomiendo saber si ya existe el campo, no creo que por cada visita quieras guardar nuevamente los datos, puedes actualizar la cantidad de visitas y ya. Disculpa si me desvié un poco de tu duda inicial, pero analizalas un poco y mejoraras.
 
Si, aunque era una curiosidad, la mejor opción es usar mysql u otra base de datos, ya que están diseñadas para soportar acceso concurrente. Gracias a todos por su ayuda.
 
Atrás
Arriba