• User Attivo

    Aggiornamento file xml

    • 3 file (generatore_xml.php file_statistiche.xml generatore_grafici.php)
    • generatore_xml.php preleva i dati e aggiorna il file file_statistiche.xml
    • generatore_grafici.php preleva i dati da file_statistiche.xml e genera le tabelle

    Ho creato uno script in php che aggiorna un file.xml nel quale vengono inseriti i dati per delle statistiche. E un'altra pagina php che legge i dati inseriti per generare le tabelle. Tutto il sistema in se funziona alla perfezione.

    Però sorge un problema. Che cercherò di spiegare con un esempio.

    Nel mio sito ci sono 0 persone connesse, il valore 0 viene prelevato, inserito nel file .xml e le statistiche vengono generate con valore 0.
    Pochi minuti dopo, nel mio sito ci sono 4 persone connesse, il valore 4 viene prelevato, inserito nel file .xml. In questo caso però quando lo script php legge il file .xml continuerà a leggere il numero 0, anche se vi è scritto 4.
    Se carico via web la pagina .xml al primo caricamento avrò come visualizzazione 0, ma dopo un aggiornamento (premendo F5) visualizzerò 4.
    Dopo questo passaggio il secondo file php genererà delle statistiche col numero 4.

    In definita, per generare delle statistiche adeguate devo per forza prima caricare via browser il file .xml. Avete una idea su come evitare questo problema?

    Sembra la storia dell'orso, ma non trovato altre parole per descrivere meglio il mio problema. Grazie per le risposte. Spero nessuno si sia scoraggiato ad aiutarmi quando ha visto tutte queste parole.


  • User Attivo

    Mi è appena arrivata una e-mail con la segnalazione di alcuni errori. Ve li riporto.

    PHP Warning: fopen(../Ampie/ampie_data_uo.xml): failed to open stream: No such file or directory in /var/www/vhosts/dynamicbox.it/httpdocs/Statistiche/Cron/creatore_xml.php on line 78
    PHP Warning: fwrite(): supplied argument is not a valid stream resource in /var/www/vhosts/dynamicbox.it/httpdocs/Statistiche/Cron/creatore_xml.php on line 79
    PHP Warning: fclose(): supplied argument is not a valid stream resource in /var/www/vhosts/dynamicbox.it/httpdocs/Statistiche/Cron/creatore_xml.php on line 81
    PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/vhosts/dynamicbox.it/httpdocs/Statistiche/Cron/creatore_xml.php on line 143
    PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/vhosts/dynamicbox.it/httpdocs/Statistiche/Cron/creatore_xml.php on line 136
    PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/vhosts/dynamicbox.it/httpdocs/Statistiche/Cron/creatore_xml.php on line 211
    PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/vhosts/dynamicbox.it/httpdocs/Statistiche/Cron/creatore_xml.php on line 204
    PHP Warning: fread(): supplied argument is not a valid stream resource in /var/www/vhosts/dynamicbox.it/httpdocs/Statistiche/Cron/creatore_xml.php on line 229
    PHP Warning: fclose(): supplied argument is not a valid stream resource in /var/www/vhosts/dynamicbox.it/httpdocs/Statistiche/Cron/creatore_xml.php on line 230


  • ModSenior

    Ciao the_dream,
    se non posti la parte di codice interessata è difficile aiutarti. 🙂
    Verifica intanto che il percorso usato dallo script sia corretto, inoltre alcune query sembra abbiano errori di sintassi, controlla quelle che vengono generate.


  • User Attivo

    Il codice base è questo. Presente in un altro mio topic. Corretto da te 🙂
    Il codice è quello, cambiano solo i nomi delle variabili. Dimenticavo che lo script php viene eseguito da cron con questo comando.

    php -q httpdocs/Statistiche/Cron/creatore_xml.php
    

    [PHP]$file = '';
    $fp = fsockopen("artic.nsn3.net", 8080, $errno, $errstr, 30);
    if (!$fp) {
    echo "$errstr ($errno)<br />\n";
    } else {
    $out = "GET /hosts/nsh_dewizards/public/raw_status.txt HTTP/1.1\r\n";
    $out .= "Host: artic.nsn3.net\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    $header = '';
    do{
    $header .= fgets($fp, 128);
    }while(strpos($header, "\r\n\r\n") === false);
    while(!feof($fp)){
    $file.=fgets($fp, 128);
    }
    fclose($fp);
    }

    $testo = explode('clients=', $file);
    if(isset($testo[1]))
    {
    $testo = explode("\n", $testo[1]);

    echo $testo[0];

    $stringa_xml_doc = "
    <?xml version="1.0" encoding="UTF-8"?>
    <pie>
    \t<slice title="Sevenshard">$testo[0]</slice>
    \t<slice title="Once a day">300</slice>
    \t<slice title="Once a week">4</slice>
    \t<slice title="Once a week">4</slice>
    </pie>
    ";

    $stringa_xml = $stringa_xml_doc;

    $file_name = "ampie/ampie_data.xml";
    $file = fopen ($file_name,"w");
    $num = fwrite ($file, $stringa_xml);

    fclose($file);

    }[/PHP]

    Riporto il codice invece presente nelle righe segnalate nella e-mail di cron.

    78 - $file = fopen ($file_name,"w");
    79 - $num = fwrite ($file, $stringa_xml);
    81 - fclose($file);
    136 - while ($row = mysql_fetch_array($query)) {
    143 - while ($row = mysql_fetch_array($query)) {
    204 - while ($row = mysql_fetch_array($query)) {
    211 - while ($row = mysql_fetch_array($query)) {

    Il problema quindi sono le righe 78 79 e 81. Tra la 79 e l'81 c'è solo una riga vuota.


  • Super User

    Intanto devi partire con il verificare i permessi sul file da lavorare, magari per fare una prova metti 777 sulla cartella che lo contiene

    		 				 [PHP](http://www.giorgiotave.it/wikigt/os/PHP) Warning:   [fopen](http://www.giorgiotave.it/wikigt/os/Fopen)(../Ampie/ampie_data_uo.xml):  failed to open stream: No such file or directory in  /var/www/vhosts/dynamicbox.it/httpdocs/Statistiche/Cron/creatore_xml.php  on line 78

  • User Attivo

    Ho impostato il file 777, ma nulla... Ho rivisto il codice, e in questa parte si individua l'unico errore che mi è rimasto.

    [PHP]$sql="SELECT client_1, client_2 FROM dynamic_statistiche WHERE progetto='sevenshard'";
    $query = @mysql_query ($sql) or die (mysql_error());

    while ($row = mysql_fetch_array($query)) {

    $client_1="$row[client_1]";
    $client_2="$row[client_2]";

    $media = ceil((($client_1 + $client_2) / 2));

    $sql="UPDATE dynamic_statistiche SET media='$media' WHERE progetto='sevenshard'";
    $query = @mysql_query ($sql) or die (mysql_error());

    }[/PHP]


  • Super User

    Unico errore rimasto? Puoi specificare quale, per favore 😉


  • User Attivo

    L'errore rimasto è quello della riga 136, cioè il while che ho scritto nel messaggio #6. Mentre per gli errori della riga 78 79 81 (lettura, scrittura e chiusura del file .xml non riesco a trovare soluzione).


  • Super User

    Metti 777 sulla cartella che deve contenere il file


  • Super User

    ti butto lì un idea, ma per la lettura del xml con i dati realtime perchè non utilizzare ajax, magari con un refresh ogni minuto?

    così avrai sempre dei dati aggiornati sulla situazione del sito.

    per la questione valore 0 anche se ci sono 4 persone connesse, beh penso dipenda da quanto spesso il cron chiama il generatore del xml.


  • User Attivo

    La chiamata avviene ogni 5 minuti. Anche se dovesse avvenire ogni 20 minuti il problema si presenterebbe lo stesso.
    Ho messo anche 777 sulla cartella, nessun risultato positivo


  • Super User

    un dubbio il sistema funziona così:

    12.00 il cron chiama lo script aggiornamento, 0 persone connesse, quindi 0 nel xml
    12.01 io mi collego, leggo il file xml e trovo 0
    12.05 il cron chiama lo script aggiornamento, 1 persona connessa, quindi 1 nel xml
    12.06 un altra persona si collega, legge il file xml e trova 1

    oppure ogni volta che un utente si collega il sistema chiama l'aggiornamento?

    io personalmente, per una maggiore praticità, farei una cosa del genere:

    in un file txt metto i seguenti dati:

    timestamp - md5(ip)

    l'aggiornamento e check viene fatto ogni volta che viene aperta una pagina

    fai si che il tutto venga processato prima dell'header e valuti magari un timeout di 30minuti per ip (alternativamente puoi fare una cosa analoga usando dei cookie se non vuoi farlo per ip)

    personalmente io eviterei un cron per una cosa del genere, soprattuto perchè se funziona generando solo lui i dati nel xml non avrai mai i dati aggiornati.


  • User Attivo

    Ci sono molti modi per ottenere un risultato più che accettabile.
    Io sto utilizzando questo sistema perché ho più libertà di movimento e sopratutto perché può essere interfacciato con phpbb3, joomla e wordpress.

    Comunque ricordo che il sistema funziona, nonostante Cron mi invii per e-mail questi errori, il codice funziona alla meraviglia. Però l'unico problema è che il file .xml non si aggiorna subito, ma sono dopo assere stato caricato via web.


  • Super User

    utilizzi qualche mod per il caching dei contenuti?


  • User Attivo

    no... nulla...


  • User Attivo

    Ho trovato la soluzione ai miei problemi in un altro vostro topic 127762-refresh-datagrid-dopo-aggiornamento-file-xml.html... Grazie 1000