VegetaSSJ5
07-02-2008, 13:39
Dunque ho pensato che per un sito che gestisco io avrebbe potuto essermi utile un file di servizio dove sono memorizzate alcune variabili tipo il contatore degli accessi, l'attuale id degli ordini (non abbiamo un db) ed eventualmente espanderlo con altri valori.
Il file l'ho chiamato service.txt ed è formato in questo modo [NOME_PARAMETRO]:[VALORE]COUNTER:19
IDORDER:20
Ho quindi scritto alcune funzioni per la gestione di questo file. Ho dei problemi con l'incremento dei valori. In realtà l'incremento funziona bene, però ogni volta che viene effettuata l'operazione di incremento (e quindi salvataggio del file) vengono inseriti tra le righe una serie esponenziale di "\n". Vi incollo qui sotto un file di test contenente le funzioni di incremento contatore + salvataggio del file. Basta fare copia/incolla su un file php ed è già funzionante (o non funzionante che dir si voglia :D).
La funzione saveFile l'ho presa da un post sul forum di php.net e presumo funzioni bene.
Potete cortesemente aiutarmi ad individuare e risolvere il problema? So che vi sto ammorbando con le mie strane richieste di aiuto, ma questa credo e spero che sia l'ultima, per questo periodo almeno... ;)
<?php
// FILE DI SERVIZIO
define("SERVICE_FILE_PATH", "service.txt");
//***** FUNCTIONS BEGIN
function updateServiceFile ($parameter) {
// MEMORIZZO RIGA PER RIGA IL FILE DI SERVIZIO NEL VETTORE $service
$service = file(SERVICE_FILE_PATH);
if (!$service) {
echo "ERRORE (".__FUNCTION__."): leggendo ".SERVICE_FILE_PATH;
exit();
}
// CERCO LA RIGA CONTENENTE IL PARAMETRO DA INCREMENTARE
foreach ($service as $index => $row) {
// SE TROVO IL PARAMETRO DA AGGIORNARE NELLA RIGA $row
if (stripos($row, $parameter) !== FALSE) {
//PRENDO LA POSIZIONE DEL DELIMITATORE :
if (($separator_pos = stripos($row, ":")) !== FALSE) {
// METTO NELLA VARIABILE IL VALORE DEL PARAMETRO, CIOè DAL CARATTERE SUCCESSIVO AL DELIMITATORE FINO A FINE STRINGA
$parameter_value = substr($row, $separator_pos+1);
// INCREMENTO IL VALORE
$parameter_value += 1;
// AGGIORNO LA RIGA $index SECONDO IL FORMATO parametro:valore
$service[$index] = trim($parameter.":".$parameter_value);
break;
}
else {
echo "ERRORE (".__FUNCTION__."): Non trovo il delimitatore due punti nella riga.<br>DEBUG INFO: Numero_riga => valore<br>".$index." => ".$row;
exit();
}
}
}
// SALVO NEL FILE LA STRINGA RESTITUITA DALLA IMPLODE
// LA IMPLODE RESTITUISCE UNA STRINGA UNICA PARTENDO DA UN VETTORE
// E SEPARA TUTTE LE RIGHE INTERMEDIE INTERPONENDO IL CARATTERE PASSATO COME PRIMO PARAMETRO
saveFile(SERVICE_FILE_PATH, implode("\n", $service));
}
function saveFile ($filename, $content) {
clearstatcache();
ignore_user_abort(true); ## prevent refresh from aborting file operations and hosing file
if (file_exists($filename)) {
// PASSANDO w COME SECONDO PARAMETRO IL FILE VIENE RIAZZERATO
// E IL SUO CONTENUTO SOSTITUITO COMPLETAMENTE CON QUELLO DEL PARAMETRO $CONTENT
$fh = fopen($filename, 'w');
while(1) {
if (flock($fh, LOCK_EX)) {
fwrite($fh, $content);
fflush($fh);
//ftruncate($fh, ftell($fh));
flock($fh, LOCK_UN);
break;
}
}
fclose($fh);
}
else {
echo "ERRORE (".__FUNCTION__."): il file da salvare non esiste.<br>File Name => ".$filename;
exit();
}
}
//******* FUNCTIONS END
//******* INCREMENTO DEL PARAMETRO "COUNTER"
updateServiceFile("COUNTER");
//******* INCREMENTO DEL PARAMETRO "IDORDER"
updateServiceFile("IDORDER");
?>
Il file l'ho chiamato service.txt ed è formato in questo modo [NOME_PARAMETRO]:[VALORE]COUNTER:19
IDORDER:20
Ho quindi scritto alcune funzioni per la gestione di questo file. Ho dei problemi con l'incremento dei valori. In realtà l'incremento funziona bene, però ogni volta che viene effettuata l'operazione di incremento (e quindi salvataggio del file) vengono inseriti tra le righe una serie esponenziale di "\n". Vi incollo qui sotto un file di test contenente le funzioni di incremento contatore + salvataggio del file. Basta fare copia/incolla su un file php ed è già funzionante (o non funzionante che dir si voglia :D).
La funzione saveFile l'ho presa da un post sul forum di php.net e presumo funzioni bene.
Potete cortesemente aiutarmi ad individuare e risolvere il problema? So che vi sto ammorbando con le mie strane richieste di aiuto, ma questa credo e spero che sia l'ultima, per questo periodo almeno... ;)
<?php
// FILE DI SERVIZIO
define("SERVICE_FILE_PATH", "service.txt");
//***** FUNCTIONS BEGIN
function updateServiceFile ($parameter) {
// MEMORIZZO RIGA PER RIGA IL FILE DI SERVIZIO NEL VETTORE $service
$service = file(SERVICE_FILE_PATH);
if (!$service) {
echo "ERRORE (".__FUNCTION__."): leggendo ".SERVICE_FILE_PATH;
exit();
}
// CERCO LA RIGA CONTENENTE IL PARAMETRO DA INCREMENTARE
foreach ($service as $index => $row) {
// SE TROVO IL PARAMETRO DA AGGIORNARE NELLA RIGA $row
if (stripos($row, $parameter) !== FALSE) {
//PRENDO LA POSIZIONE DEL DELIMITATORE :
if (($separator_pos = stripos($row, ":")) !== FALSE) {
// METTO NELLA VARIABILE IL VALORE DEL PARAMETRO, CIOè DAL CARATTERE SUCCESSIVO AL DELIMITATORE FINO A FINE STRINGA
$parameter_value = substr($row, $separator_pos+1);
// INCREMENTO IL VALORE
$parameter_value += 1;
// AGGIORNO LA RIGA $index SECONDO IL FORMATO parametro:valore
$service[$index] = trim($parameter.":".$parameter_value);
break;
}
else {
echo "ERRORE (".__FUNCTION__."): Non trovo il delimitatore due punti nella riga.<br>DEBUG INFO: Numero_riga => valore<br>".$index." => ".$row;
exit();
}
}
}
// SALVO NEL FILE LA STRINGA RESTITUITA DALLA IMPLODE
// LA IMPLODE RESTITUISCE UNA STRINGA UNICA PARTENDO DA UN VETTORE
// E SEPARA TUTTE LE RIGHE INTERMEDIE INTERPONENDO IL CARATTERE PASSATO COME PRIMO PARAMETRO
saveFile(SERVICE_FILE_PATH, implode("\n", $service));
}
function saveFile ($filename, $content) {
clearstatcache();
ignore_user_abort(true); ## prevent refresh from aborting file operations and hosing file
if (file_exists($filename)) {
// PASSANDO w COME SECONDO PARAMETRO IL FILE VIENE RIAZZERATO
// E IL SUO CONTENUTO SOSTITUITO COMPLETAMENTE CON QUELLO DEL PARAMETRO $CONTENT
$fh = fopen($filename, 'w');
while(1) {
if (flock($fh, LOCK_EX)) {
fwrite($fh, $content);
fflush($fh);
//ftruncate($fh, ftell($fh));
flock($fh, LOCK_UN);
break;
}
}
fclose($fh);
}
else {
echo "ERRORE (".__FUNCTION__."): il file da salvare non esiste.<br>File Name => ".$filename;
exit();
}
}
//******* FUNCTIONS END
//******* INCREMENTO DEL PARAMETRO "COUNTER"
updateServiceFile("COUNTER");
//******* INCREMENTO DEL PARAMETRO "IDORDER"
updateServiceFile("IDORDER");
?>