Newsgroup: it.comp.www.php
Titolo: Contatore e sessione

Salve, vorrei realizzare un contatore di accessi che tenga conto dei
diversi IP che accedono al sito e che ogni due minuti mi conteggi anche
gli accessi dallo stesso IP. No i refresh, ovviamente (se sono fatti
entro i due minuti).
Devo usare le sessioni?
Grazie.
-- 
Gregor

Gregor wrote:

puoi usare un db che memorizzi IP, data di accesso 
ogni volta che carichi una pagina controlli che la data attuale sia
all'interno di quella memorizzata + 2 minuti, se lo è non fai niente, se
non lo è +1 al contatore
poi aggiorni la data memorizzata per l'IP corrispondente a quella attuale
--
www.iuz-lab.info

Quoto e faccio qualche aggiunta. Personalmente invece che usare un db 
userei o un file xml o un file di testo, cosicchè la lettura risulti piu 
veloce.
Inoltre svuoterei questo file con uno script apposito che parte alle 
24:00. Però chiaramente lo puoi fare solamente se il server lo gestisci 
tu, altrimenti dovresti mandare lo script al gestore.
Lo script sarebbe una sciocchezza del tipo:
#!/bin/bash
echo "" > ip.log
Spero di esserti stato utile, ciao! ;)


 attuale
Non ho una grande esperienza in merito...:-(
Ho provato questo (
http://freephp.html.it/script/view_script.asp?id=581
)
che è ottimo, ma non mi aggiorna il contatore per accessi provenienti
dallo stesso IP.
In alternativa, avevo pensato a qualcosa di più semplice, tipo:
<?php
session_start();
if(isset($_REQUEST['contatore']))
{
 $_SESSION['contatore'] = 1;
}
else
{
 $_SESSION['contatore'] += 1;
}
?>
<html>
<head>
</head>
<body>
<?php
print("Count: " . $_SESSION['contatore'] . "<br>");
?>
</body>
</html>
E magari fare un controllo sul tempo con time() o simili...
Comunque grazie e se vorrai darmi altri suggerimenti...:-)
-- 
Gregor

 Lo script sarebbe una sciocchezza del tipo:
Puo' essere tranquillamente fatto anche in PHP.
P.S.
http://wiki.news.nic.it/QuotarBene
-- 
I am what I am, I do what I can
L'uomo, conscio di sbagliare, persevera.

 
 
--
www.iuz-lab.info

 coerente.. vedo se entro stanotte riesco a scriverti qualcosa..
Grazie!
-- 
Gregor

 
Grazie per il link, sei stato gentilissimo.

 E' vero ma come fai partire lo script php ad un orario stabilito?
Utilizzando i crontab. 
Se sei in hosting con cPanel o Ensim puoi impostarli da pannello o
tramite telnet/SSH. Se non hai i crontab disponibili puoi
tranquillamente utilizzare un sistema di pooling ed alla prima
richiesta utile (es la prima dopo le 24.00) esegui il codice di purging.


Beh in realtà ho usato questa tecnica anche sui portali che curo; mi 
dispiace che non posso postarti le stats ma il sistemista è alquanto 
geloso. Però fidati che è molto piu veloce.


 coerente.. vedo se entro stanotte riesco a scriverti qualcosa..
Al momento ho risolto con i cookies, dici che è una buona soluzione?
Se il client non li ha abilitati?
Tnx!
-- 
Gregor

 Però fidati che è molto piu veloce.
Spiacente ma non mi fido, se vuoi che ci creda devi portare a supporto
delle tue affermazione qualche cosa di piu' della tua parola.
Ad esempio potresti postare un benchmark di uno stress tool con i tempi
ed il workload delle due implementazione ed, ovviamente, i sorgenti
altrimenti e' come dire che una 500 e' piu' veloce di un ferrari senza
dire che la ferrari e' senza benzina e va fatta muovere a spinta.


Gregor wrote:

non è una questione di cookie o sessioni..
è l'approccio che è errato..
cookie e sessioni servono a trasportare variabili e relativi valori da una
pagina ad un'altra nell'ambito di un singolo utente
un sistema di conteggio accessi costruito in questo modo darà come risultato
il numero di accessi totale che quel dato utente ha effettuato.. non quello
totale!
se vuoi un conteggio totale devi memorizzare il totale degli accessi in
qualche loco come un file, un db da dove lo potra incrementare ogni volta
necessario.
es.
DB
IP  - last_access
PHP
ottieni dal db l'ultima data di accesso dell'IP utente
se non esiste memorizzi nel db IP - data attuale
se esiste controlli che la data attuale meno 2 minuti sia minore di quella
memorizzata
se è minore non fai niente
se è maggiore apri 'file' in scrittura/lettura leggi il valore lo incrementi
di uno e lo memorizzi
aggiorni la data per quell'IP portandola a quella attuale
questo era un esempio molto schematico.. ma te l'ho detto entro stanotte
vedrò di farti trovare qualcosa di utilizzabile
--
www.iuz-lab.info

 stanotte vedrò di farti trovare qualcosa di utilizzabile
Grazie ancora!
-- 
Gregor

 incrementa se accedo più volte da uno stesso IP :-(
questo funziona anche se non l'ho ancora testato completamente
<?php
$db_server         = "localhost";
$db_user           = "iuz_test";
$db_pass           = "1234567890";
$db_base           = "iuz_test";
$estimated_time    = "15";
$c_time = time()-$estimated_time;
$rl = mysql_connect($db_server, $db_user, $db_pass);
mysql_select_db($db_base, $rl);
$date_error = mysql_fetch_array(mysql_query("SELECT count(date) as error
FROM summary_table WHERE date = '" . date('d-m-Y', time()) . "'", $rl));
if($date_error['error'] < 1) mysql_query("INSERT INTO summary_table (date)
values ('" . date('d-m-Y', time()) . "')", $rl) or die(mysql_error());
$last_access = mysql_query("SELECT  ts FROM accesses WHERE IP =
'{$_SERVER['REMOTE_ADDR']}'", $rl) or die(mysql_error());
if(mysql_num_rows($last_access) < 1){
        mysql_query("INSERT INTO accesses (ip, ts) values
('{$_SERVER['REMOTE_ADDR']}', " . time() . ")", $rl) or die(mysql_error());
        mysql_query("UPDATE summary_table SET day_hit = 1 WHERE date = '" .
date('d-m-Y', time()) . "'", $rl) or die(mysql_error());
}
else {
        $last_access = mysql_fetch_array($last_access);
        if($c_time > $last_access['ts']){
                mysql_query("UPDATE accesses SET ts = " . time() . " WHERE IP =
'{$_SERVER['REMOTE_ADDR']}'", $rl) or die(mysql_error());
                mysql_query("UPDATE summary_table SET day_hit = day_hit+1 WHERE date = '"
. date('d-m-Y', time()) . "'", $rl) or die(mysql_error());
        }
}
mysql_query("UPDATE accesses SET ts = " . time() . " WHERE IP =
'{$_SERVER['REMOTE_ADDR']}'", $rl) or die(mysql_error());
$today_count = mysql_fetch_array(mysql_query("SELECT day_hit FROM
summary_table WHERE date = '" . date('d-m-Y', time()) . "'", $rl));
$total_count = mysql_fetch_array(mysql_query("SELECT sum(day_hit) FROM
summary_table", $rl));
$connected = mysql_fetch_array(mysql_query("SELECT count(ts) FROM accesses
WHERE ts >= $c_time", $rl));
echo <<< summary
<table bgcolor='black' cellpadding='0' cellspacing='1'>
<tr>
        <td bgcolor='white'>Total count</td>
        <td bgcolor='white'>{$total_count['sum(day_hit)']}</td>
</tr>
<tr>
        <td bgcolor='white'>Today count</td>
        <td bgcolor='white'>{$today_count['day_hit']}</td>
</tr>
<tr>
        <td bgcolor='white'>Connected</td>
        <td bgcolor='white'>{$connected['count(ts)']}</td>
</tr>
</table>
summary;
?>
e la struttura del db è 
CREATE TABLE `accesses` (
  `ip` varchar(255) NOT NULL default '',
  `ts` int(12) default NULL
) TYPE=MyISAM;
CREATE TABLE `summary_table` (
  `day_hit` int(11) NOT NULL default '0',
  `date` char(10) NOT NULL default ''
) TYPE=MyISAM;
fammi sapere!!
--
www.iuz-lab.info

 fammi sapere!!
Appena riesco provo!
Grazie mille!
-- 
Gregor

 fammi sapere!!
Sembra funzionare bene...adesso lo sto studiando riga per riga. Tnx!
Non so come mai, all'improvviso si sono azzerati i contatori (erano su
150...) e son ripartiti da zero.
Grazie ancora!
-- 
Gregor

Topic astruso: spiego subito.
Stò cercando un modo per referenziare il $this.
class foo {
	function foo($id){
		foo->read_from_db($id);
	}
	function read_from_db($id){
		//varie istruzioni
	}	
}
$a=new foo();
Il mio obbiettivo sarebbe immagazzinare la classe dentro $GLOBALS per 
avere un oggetto foo univoco per ogni id che richiamo.
Così da arrivare ad avere analogo a quello che avrei con un codice di 
questo tipo:
$GLOBALS['foes'][4]=new foo(4);
$a=&$GLOBALS['foes'][4];
...con un codice di questo tipo:
$a= new foo(4);
Il problema principale è la retrocompatibilità col resto 
dell'applicazione (ed un buon numero di versioni sparse per i server del 
globo), che mi impedisce di usare direttamente $Globals o di usare 
funzioni tipo $a=loadFoo().
D'altro canto mettere nel costruttore di un oggetto $this=&$GLOBALS
[fo... non pare funzionare (a meno che non abbia sbagliato da qualche 
parte io).
Fin'ora sono riuscito a mettere in globals l'array associativo interno 
delle varie classi, ma non a mettere in global tutto l'oggetto.
Qualcuno ha qualche idea?
Tac