PDA

View Full Version : [PHP] sessioni che cambiano gli array???


cicoandcico
17-04-2005, 20:04
ho un problema stranissimo con l'uso delle sessioni in php. il codice è riportato sotto.
vi descrivo il funzionamento e il problema: getusers è una funzione che ritorna gli utenti iscritti a una mailing list (crittati) sotto forma di un array con la forma UTENTE => TIMESTAMP. il codice è ottimizzato per caricare tale array una volta sola, a meno di eventuali modifiche al numero di utenti stesso: per fare questo tiene una variabile di sessione con la data di ultima modifica. fin qui tutto funziona bene, l'array viene caricato correttamente e stampato.
il problema è quando si fa il refresh: l'array, senza che nessuno glielo chieda, si modifica!

*OUTPUT PRIMA DEL REFRESH*:
filemtime: 1113663839
last_users_modified: 0
refreshing users...
Array ( [me2V1XMjpw7ea] => 1113663839 [me2V1ONfVeDdZvARyNRO] => 1113663809 [me2V1dMbiY@1Q2-] => 1113663596 )


*DOPO IL REFRESH*:
Array ( [0] => me2V1dMbiY@1Q2-_~_1113663596 [1] => me2V1ONfVeDdZvARyNRO_~_1113663809 [2] => me2V1XMjpw7ea_~_1113663839 )

è come se venisse chiamata, la seconda volta, la funzione getusers(true, true), però nessuno la chiama! ne è la prova che non vengono stampate le linee:
filemtime: 1113663839
last_users_modified: 0
refreshing users...

il bello è che sul mio pc tutto funziona bene, su altri invece no. inoltre se non uso il blocco per l'ottimizzazione, e uso direttamente la
$users = getusers(true);
tutto funziona bene. il problema è proprio, a quanto sembra, che nel refresh la variabile $_SESSION['users'] viene reinizializzata come getusers(true,true). io non so veramente che pesci pigliare.


session_start();

function getusers($valid, $report_filenames = false)
{
global $addresses_dir;
$users = array();
if ($handle = opendir($addresses_dir))
{
while (false !== ($file = readdir($handle)))
{
if ($valid && $file != "." && $file != ".." && !strstr($file, "~--OLD--~")) array_push ($users, $file);
if (!$valid && $file != "." && $file != ".." && strstr($file, "~--OLD--~")) array_push ($users, $file);
}}
if ($report_filenames == true) return $users;
$user_array = array();
foreach($users as $item){
$user_data = explode("_~_", $item);
if ($valid) $user_array[$user_data[0]] = trim($user_data[1]); //filenames->timestamps
else $user_array[$user_data[0]] = str_replace("~--OLD--~", "", trim($user_data[1]));
}
arsort($user_array);
return $user_array;
}

//Retrieving users and groups with performance optimization
//(users are retrieved once and saved in a session var, that is refreshed ONLY when they are modified)
if (!isset($_SESSION['users'])) $_SESSION['users'] = array();
if (!isset($_SESSION['last_users_modified'])) $_SESSION['last_users_modified'] = 0;
if(filemtime($addresses_dir) > $_SESSION['last_users_modified']) {
print "filemtime: ".filemtime($addresses_dir)."<br>last_users_modified: ".$_SESSION['last_users_modified']."<br>refreshing users...<br>";
$_SESSION['last_users_modified'] = filemtime($addresses_dir);
$_SESSION['users'] = array();
$_SESSION['users'] = getusers(true);
}
$users = &$_SESSION['users'];
print_r($users);