Jump to content

[PHP] Contador de Visitas


AriOps
 Share

Recommended Posts

É necessário ter um ficheiro contador.txt na mesma pasta, de inicio com um 0.

/*********************************************
CONTADOR :: Desenvolvido por Daniel Correia
*********************************************/
$ficheiro = "contador.txt";
$abrir = fopen($ficheiro, 'r+') or die("O Ficheiro não pode ser aberto.");
$contador = fread($abrir, filesize($ficheiro));
$intcontador = (int) $contador;
$intcontador++;
rewind($abrir);
fwrite($abrir, $intcontador);
fclose($abrir);
print $intcontador;

Em Acção: http://www.ptattacks.com/contador_visitas

Daniel Correia

Link to comment
Share on other sites

não te esqueças de por lá o ficheiro contador.txt e a a tag PHP (<?php ?>) no código acima.

Como podes ver funciona, deixei aí o link.

Cumps

Daniel Correia

Link to comment
Share on other sites

Não dá erro! Fica tudo branco :S!

EDIT

Então ninguem para explicar  ??

Our lives begin to end the day we become silent about things that matter - Martin Luther King

Link to comment
Share on other sites

Bem me parecia ;)

Cumps

Tipo eu tinha adaptado o teu código e tava a faltar uma entrada. Ele abre a extensão que eu criei .skin

Our lives begin to end the day we become silent about things that matter - Martin Luther King

Link to comment
Share on other sites

Este código tem um problema grave .....

Imaginem que tem dois utilizadores a acessar ao mesmo site .

Seria algo do género :

#Processo 1

1- Abre o Ficheiro contendo o valor

#Processo 2

1- Abre o Ficheiro contendo o valor

#Processo 1

2- Lê o ficheiro contendo o valor

#Processo 2

2-Lê o ficheiro contendo o valor

#Processo 1

3-Incrementa o Valor

#Processo 2

3-Incrementa o Valor..

Ora como vocês vem.. no processo 2 o ficheiro é lido primeiro que o processo 1 faça as alterações... logo em 2 visitas o contador só vai gravar 1...

Para resolver esta situação deve ser usado um acesso exclusivo ao ficheiro através da função flock

flock(filehandle,operation);

Podem ver mais através de http://php.telepac.pt/manual/pt_BR/function.flock.php

Cumps, Gurzi :)

Link to comment
Share on other sites

Ora como vocês vem.. no processo 2 o ficheiro é lido primeiro que o processo 1 faça as alterações... logo em 2 visitas o contador só vai gravar 1...

O contador não vai gravar só 1..... 1º porque ele incrementa logo que uma pessoa entra site, 2º é quase impossivel alguém entrar ao mesmo tempo que outra pessoa.

Contador visitas

          1

Pessoa entra no site -> Contador de Visitas

                                                    2

Outra pessoa entra -> Contador de Visitas

                                                    3

Não sei se me fiz entender...

Link to comment
Share on other sites

@kingless - se tu tiveres uma perspectiva grande em vez de sites a brincar para os teus amigos, vai chegar uma altura em que vais ter muita gente a entrar no site ao mesmo tempo, imagina o www.google.com, achas que nunca ninguem entrou ao mesmo tempo ? ...

Ora... Se tu perceberes bem isto, a verdade é que o 2º utilizador vai ler o ficheiro primeiro que o outro escreva  a sua presença logo em duas visitas só é registada uma...

Para isso se usa o flock que dá um acesso exclusivo ao ficheiro, é bom porque enquanto o processo de escrita não for completado o outro não acede ao ficheiro, mas como isto se faz em 0,00000000000000000001 milésimas de segundo ninguem nota que está à espera.

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

eis o código correcto

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

$filename = "contador.txt";
$file = @fopen($filename, "r+")
OR die("Failed to open the file");
@flock($file, LOCK_EX)
OR die("Could not lock the file");
$s = fgets($file,6);
$count = (int) $s;
$count += 1;
rewind($file);
if(@fwrite($file,$count)== -1)
die("Failed to write to file");
echo $count;
@flock($file,LOCK_UN)
OR die("Could not unlock the file");
@fclose($file);

UM abraço, Gurzi :)

Link to comment
Share on other sites

@kingless - se tu tiveres uma perspectiva grande em vez de sites a brincar para os teus amigos, vai chegar uma altura em que vais ter muita gente a entrar no site ao mesmo tempo, imagina o www.google.com, achas que nunca ninguem entrou ao mesmo tempo ? ...

Ora... Se tu perceberes bem isto, a verdade é que o 2º utilizador vai ler o ficheiro primeiro que o outro escreva  a sua presença logo em duas visitas só é registada uma...

Para isso se usa o flock que dá um acesso exclusivo ao ficheiro, é bom porque enquanto o processo de escrita não for completado o outro não acede ao ficheiro, mas como isto se faz em 0,00000000000000000001 milésimas de segundo ninguem nota que está à espera.

vou deixar o código correcto em anexo porque o Fórum tem umas medidas de segurança um pouco weird, estando a não permitir a inserção do meu código.

UM abraço, Gurzi :)

Só se utiliza um contador de visitas em .txt em sites que entram poucas pessoas.... Agora em sites grandes como google, hotmail... tem que se criar um contador com  base de dados mysql ou outra qualquer. 

E não é aconselhado utilizar-se esse contador de visitas porque ele conta mesmo que se faça apenas refresh a página.

Link to comment
Share on other sites

Sim, mas este tópico refere-se á existência do método file , só disse que para 2 visitantes ao mesmo tempo não é concreto e real, para grandes sites usa-se o suporte a sql, óbvio

Link to comment
Share on other sites

Bem como estavam a falar em contadores por SQL, resolvi fazer este pequeno script assim muito rapidamente. qualque coisa que acham que deva mudar digam.

$server = "localhost";
$bd = "contador";
$tabela = "visitas";
$user = "root";
$pass = "";

$ligar = mysql_connect("$server", "$user", "$pass");
mysql_select_db($bd);
$sql = "SELECT * FROM $tabela ORDER BY ID DESC LIMIT 0 , 1";
$query = mysql_query($sql) or die(mysql_error());
$fetch_query = mysql_fetch_assoc($query);

$visita_actual = $fetch_query{'ID'} + 1;
$data = date("Y-m-d") ." ". date("H:i:s");
$ip = $_SERVER['REMOTE_ADDR'];
$sql_inserir = "INSERT INTO $tabela (`IP`,`Data`) VALUES ('$ip', '$data')";
mysql_query($sql_inserir) or die(mysql_error());
echo $visita_actual;

Criar tabela:

CREATE TABLE `visitas` (
  `ID` int(11) NOT NULL auto_increment,
  `IP` varchar(20) NOT NULL,
  `Data` datetime NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Este é para mysql, daqui a bocado deixo um para o Sybase ASE :)

Cumps

Daniel Correia

Link to comment
Share on other sites

$data = date("Y-m-d") ." ". date("H:i:s");

aqui eu acho que punha a funcao time, que devolve a data e hora em segundos, tudo numa, e dps pra ver usava a funcao date()

// $date_auto, e a data em segundos, dps de tirada da base de dados
$show_date = date ("H:i:s m/d/Y", $date_auto);

Proud LEIC-A@IST student!

Link to comment
Share on other sites

Bem aqui está a minha versão para o Sybase ASE:

<?php
$server = "dcserver";
$bd = "contador";
$tabela = "visitas";
$user = "sa";
$pass = "";

$ligar = sybase_connect("$server", "$user", "$pass");
sybase_select_db($bd, $ligar);
$sql = "SELECT * FROM $tabela ORDER BY ID DESC SET ROWCOUNT 1";
$query = sybase_query($sql);
$fetch_query = sybase_fetch_assoc($query);

$visita_actual = $fetch_query{'ID'} + 1;
$data = date("Y-m-d") ." ". date("H:i:s");
$ip = $_SERVER['REMOTE_ADDR'];
$sql_inserir = "INSERT INTO $tabela (IP,Date) VALUES ('$ip', '$data')";
sybase_query($sql_inserir);
echo $visita_actual;
?>

Criação da BD e da tabela, mudar o device conforme as necessidades

<?php
/***********
Criar BD e tabela
*********************/
$ligar = sybase_connect("dcserver", "sa", "");
sybase_query("USE master CREATE DATABASE contador ON principal = 3", $ligar) or die("erro1");
$sql2 = "USE contador
	CREATE TABLE dbo.visitas (    		
	ID	      numeric(38,0) IDENTITY,
	IP 	      varchar(20)   NOT NULL,
	Date      datetime      NOT NULL,
	)";
sybase_query($sql2, $ligar) or die("erro2");
echo "Criados com sucesso";
?>

karva vou ver se faço isso :)

Cumps

Daniel Correia

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.