Visualizzazione risultati 1 fino 3 di 3

Discussione: [PHP] Contatore visite che si impalla ogni tanto

  1. #1
    montebue non è connesso Utente giovane
    Data registrazione
    19-01-2010
    Messaggi
    36

    Predefinito [PHP] Contatore visite che si impalla ogni tanto

    Salve ragazzi,

    scrivo perchè ho un problema con un codice PHP che ho fatto parecchi mesi fa ed è venuto il momento di cambiarlo.

    Sostanzialmente si tratta di un doppio contatore visite di una pagina php: un contatore generale (visite totali) che funziona perfettamente ed un contatore giornagliero delle visite che si dovrebbe resettare ogni giorno e registrare le visite in un file che contiene quelle dell'ultimo mese.

    -Contatore totale OK
    -Contatore giornagliero OK
    -Elenco mensile VA COME GLI GIRA

    Infatti ci sono volte che funziona per mesi registrando correttamente le visite giornagliere, poi capita qualche volta (con cadenza irregolare) che si sballa tutto l'elenco con la perdita di tutti i dati nella tabella....

    La struttura del codice è la seguente:

    -main.php
    Pagina principale di cui si vuole contare le visite. Ad ogni accesso va ad aprire un file TXT dove risiede il numero delle visite totali e lo incrementa.
    La pagina inoltre deve creare un file dati (es. risultato.dat) la cui data di creazione fa riferimento all'ultimo accesso alla pagina main.php

    -contatoregiorno.php
    E' la parte di codice inclusa nella pagina che serve per incrementare il contatore giornagliero. Al passare della mezzanotte si deve fare in modo che il contatore venga azzerato e registrato il valore in tabella.
    Per fare ciò prima controllo la data dell'ultimo file creato (risultato.dat) quindi se risale al giorno corrente (numero del giorno) allora vado semplicemente ad incrementare il contatore. Altrimenti significa che si è passati la mezzanotte e registro il valore nella tabella (file TXT) e azzero il contatore.

    Codice PHP:
    <?php
    setlocale
    (LC_TIME,"it_IT");
    //
    $dataimm=strftime ("%d", filemtime("registro.foi"));
    $oracorrente=date("d");
    if (
    $dataimm == $oracorrente)//è ancora nello stesso giorno quindi aumenta il contatore

    {
    //aggiorna solo il valore della prima variabile incrementandolo di uno
    $lines1 = file("registro.foi");
    $lines1[0]=$lines1[0]+1;
    $fp=fopen("registro.foi","w");
    for (
    $i=0;$i<32;$i++)
    {
    if (
    $i<1)
    {
    // è il primo
    fwrite($fp,$lines1[0] . "\n");

    }
    else {
    fwrite($fp,$lines1[$i]);

    }

    }
    fclose($fp);
    //per inserire il numero di visite di oggi in un file separato
    $fp=fopen("oggi.foi","w");
    fwrite($fp,$lines1[0]);
    fclose($fp);

    }

    else
    //cambia la data e quindi aggiorna contatore, sposta la lista e crea il nuovo grafico

    {


    //� un nuovo giorno, quindi scrive i nuovi valori (1) e risistema l'array
    $lines1 = file("registro.foi");

    //sposta avanti
    $i=0;
    while (
    $i<32) {// perch� il 31esimo numero non va pi� riscritto!
    if ($i<1)
    {
    // � il primo i=0
    $nuovoarr[0]= 1;//oggi � la prima visita
    $nuovoarr[1]= $lines1[0];
    $i=$i+1;
    }
    else {
    //qui passa solo dopo che i=1
    $a=$i+1;
    $nuovoarr[$a]= $lines1[$i];
    $i=$i+1;
    }
    }
    //fine while
    //scrive l'array FINO QUI PERFETTO nel nuovo file

    $fp=fopen("registro.foi","w");
    for (
    $i=0;$i<32;$i++)
    {
    if (
    $i<1)
    {
    // � il primo
    fwrite($fp,$nuovoarr[0] . "\n");

    }
    else {
    fwrite($fp,$nuovoarr[$i]);

    }

    }
    fclose($fp);


    ?>
    Chiedo lumi su come posso semplificare la cosa e renderla funzionante SEMPRE non quando gli gira....il problema attuale io lo imputo a chiamate contemporanee al file php e quindi contemporanee scritture/letture dei registri giornalieri...

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,685

    Predefinito

    Forse, così è un po più snello come codice:

    Codice PHP:
    <?php
    setlocale
    (LC_TIME,"it_IT");
    //
    $dataimm=strftime ("%d", filemtime("registro.foi"));
    $oracorrente=date("d");
    if (
    $dataimm == $oracorrente)//è ancora nello stesso giorno quindi aumenta il contatore
    {
    //aggiorna solo il valore della prima variabile incrementandolo di uno
    $lines1 = file("registro.foi");
    $fp=fopen("registro.foi","w");
    if(
    $fp)
    die(
    'errore apertura file registro.foi');
    fwrite($fp,(trim($lines1[0])+1)."\n");
    $end = (count($lines1) < 32)?count($lines1):32; ///non è detto che lines1 abbia tutti e 32 elementi
    for($i=1;$i<$end;$i++)
    fwrite($fp,$lines1[$i]);
    fclose($fp);

    //per inserire il numero di visite di oggi in un file separato
    $fp=fopen("oggi.foi","w");
    if(
    $fp)
    die(
    'errore apertura file oggi.foi');
    fwrite($fp,$lines1[0]+1);
    fclose($fp);
    }
    else
    {
    $lines1 = file("registro.foi");
    $fp=fopen("registro.foi","w");
    if(
    $fp)
    die(
    'errore apertura file registro.foi');
    fwrite($fp,"1\n"); ///scrivo un 1 (prima visita del giorno)
    $end = (count($lines1) < 32)?count($lines1):32; ///uguale a sopra
    for ($i=0;$i<$end;$i++)
    fwrite($fp,$lines[$i]);
    fclose($fp);

    //perché qui NON bisognerebbe aggiornare (con 1) il file oggi.foi ?
    }
    ?>
    Hai pensato a cosa succede se un utente entra nel sito il giorno X del mese, e poi il prossimo entra sempre il giorno X, ma del mese successivo?

    Comunque:

    il problema attuale io lo imputo a chiamate contemporanee al file php e quindi contemporanee scritture/letture dei registri giornalieri...
    Potresti evitarle con la flock().. oppure... Perché non usi il database? Anche se non è mysql, anche sqlite va benissimo!

    p.s: guardati la funzione file_put_contents()

    Ciao!
    Ultima modifica di alemoppo : 28-07-2011 alle ore 16.32.45

  3. #3
    montebue non è connesso Utente giovane
    Data registrazione
    19-01-2010
    Messaggi
    36

    Predefinito

    Grazie mille infinite per la completa ed esauriente risposta!!!

    Ora metto subito alla prova il codice e vediamo se riesce a rimanere stabile

    Poi metterò anche la funzione flock() a me sconosciuta purtroppo non sono esperto di PHP!

    Per il fatto che un utente visiti il sito lo stesso giorno ma di un mese diverso è una possibile ma remota possibilità visto che solitamente sto sulle 1000-1500 visite nel contatore al giorno.

    Grazie mille ancora!!!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •