Olá!
Pediram-me para fazer, apenas um arquivo com todos os acessos do site usando PHP.

Outra regra e que se retorna uma imagem transparente com 1px/1px.
Então fiz uma rotinas em PHP bem simples:
$item = array(
'REMOTE_ADDR' => $_SERVER['REMOTE_ADDR'],
'REQUEST_TIME' => $_SERVER['REQUEST_TIME'],
'PATH_INFO' => $_SERVER['PATH_INFO'],
'HTTP_USER_AGENT' => $_SERVER['HTTP_USER_AGENT'],
'get' => @$_GET,
'post' => @$_POST,
);
$myFile = "testFile.txt";
$fh = fopen($myFile, 'a') or die("can't open file");
$stringData = json_encode($item). "n";
fwrite($fh, $stringData);
fclose($fh);
Header( "Content-type: image/gif");
Header( "Expires: Wed, 11 Nov 1998 11:11:11 GMT");
Header( "Cache-Control: no-cache");
Header( "Cache-Control: must-revalidate");
printf ("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
71,73,70,56,57,97,1,0,1,0,128,255,0,192,192,192,0,0,0,33,249,4,1,0,0,0,0,44,0,0,0,0,1,0,1,0,0 ,2,2,68,1,0,59);
exit;
Bom, neste caso, estou apenas fazendo “append” num arquivo, depois, quando for necessário, farei um perl (ou um PHP) para analisar tais dados.
Cada linha do arquivo é comporta por um JSON com a estrutura igual ao do array $item.
Um ponto positivo nesta opção é que pode-se usar tanto num e-mail quanto numa página qualquer do site, pois, não é necessário um javascript.
Assim você pode salvar quantas pessoas acessam uma pagina de forma eficiente e consultar executando um “grep”!
Mas continue lendo!
Depois de entregar o script, fiz algumas alterações nele script acima para poder permitir que seja executado algum processamento sem fazer o GIF demorar em responder.
Basicamente desabilita o gzip e fecha a conexão e continua executando o código.
Para saber mais pesquise sobre como executar código PHP depois de fechar a conexão com php, ou executar comando demorados no php.
arquivo.php
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('output_buffering', 'off');
ob_end_clean();
header("Connection: close");
ignore_user_abort(); // optional
ob_start();
header( "Content-type: image/gif");
header( "Expires: Wed, 11 Nov 1998 11:11:11 GMT");
header( "Cache-Control: no-cache");
header( "Cache-Control: must-revalidate");
printf ("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
71,73,70,56,57,97,1,0,1,0,128,255,0,192,192,192,0,0,0,33,249,4,1,0,0,0,0,44,0,0,0,0,1,0,1,0,0 ,2,2,68,1,0,59);
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
# da qui pra baixo nao adianta mudar o conteudo da tela...
$item = array(
'REMOTE_ADDR' => $_SERVER['REMOTE_ADDR'],
'REQUEST_TIME' => $_SERVER['REQUEST_TIME'],
'PATH_INFO' => $_SERVER['PATH_INFO'],
'HTTP_USER_AGENT' => $_SERVER['HTTP_USER_AGENT'],
'get' => @$_GET,
'post' => @$_POST,
);
$myDir = "/home/renato/log";
$importDir = "/home/renato/log-para-processar";
$run_perl = array ('/projetos/processador-de-logs', 'importador-de-logs.pl', 'log.txt');
$today = "log-".date('Y-m-d').".txt";
$myFile = $myDir . "/$today";
# escreve no arquivo o log do get
$fh = fopen($myFile, 'a') or die("can't open file");
$stringData = json_encode($item). "n";
fwrite($fh, $stringData);
fclose($fh);
$proc = 0;
# pega a lista de todos os arquivos que estão dentro de $myDir para mover para o $importDir ao menos que seja o $myFile
$myDirectory = opendir($myDir);
// get each entry
while($entryName = readdir($myDirectory)) {
if (substr($entryName, 0, 3) == 'log' && is_file("$myDir/$entryName") && $entryName != $today){
rename("$myDir/$entryName", "$importDir/$entryName");
$proc++;
}
}
closedir($myDirectory);
if ($proc){
# executa o perl
`(cd $run_perl[0]; perl $run_perl[1] 1>> $run_perl[2] 2>&1 &)>/dev/null`;
}
Claro que você pode remover o código perl que é executado, ou até mesmo a separação de arquivos.
Fica a seu critério!