PHP un costume superglobale domanda serie
-
27-10-2019 - |
Domanda
stavo leggendo in giro, e so che potrebbe essere impossibile da realizzare come avrei voluto che sarebbe stato ma spero ci sia un modo, quindi ecco qui ..
ho ID di di utenti ed ho un conteggio per ciascuno. Mi piacerebbe essere in grado di memorizzare i valori in memoria della macchina, e aggiornare il DB solo una volta ogni tanto, ma non assolutamente costante. La pagina si accede da molti utenti, naturalmente, e voglio la matrice di rimanere rilevanti per ciascun utente, e aggiornare, se necessario. (Questa è un'altra ragione per cui non voglio usare il DB. Aggiornamenti prendere tempo con colonne indicizzate, giusto?)
un array quali: $ My_superglobal_arr = ( '1' => 304, '2' => 763, '6' => 12, '13' => 96); sarebbe stato perfetto.
Qualche suggerimento?
Grazie!
Soluzione
Aggiornamenti prendere tempo con colonne indicizzate, giusto?
destro. Tuttavia, dipende. Mi piacerebbe fortemente suggerisco di andare per il database prima, ottiene esperienza pratica con gli aggiornamenti e roba, imparare che cosa determinata quantità di utenti che è possibile chiamare "molti". E solo allora decidere, se si ha realmente bisogno la configurazione insolita, è fantasie davvero necessario o solo immaginari.
Leggendo le vostre altre domande posso solo dire che per imparare SQL prima è un must.
Altri suggerimenti
È necessario paio ArrayAccess
con APC capacità di caching e impiegano un Singleton
modello.
class UserCounter implements ArrayAccess {
public static function getInstance()
{
static $instance;
if (!$instance) {
$instance = new self;
}
return $instance;
}
public function offsetSet($offset, $value)
{
apc_store(__CLASS__.$offset, $value);
}
public function offsetExists($offset)
{
return !!apc_fetch(__CLASS__.$offset);
}
public function offsetUnset($offset)
{
apc_delete(__CLASS__.$offset);
}
public function offsetGet($offset)
{
return apc_fetch(__CLASS__.$offset);
}
private function __construct() {}
private function __clone() {}
private function __wakeup() {}
}
Utilizzo:
$user_counter = UserCounter::getInstance();
$user_counter[1] = $user_counter[1] + 1;
var_dump($user_counter[1]);
Output alla prima richiesta:
int(1)
Sul secondo:
int(2)
Quando è necessario salvare questi contatori in un database:
$user_counter = UserCounter::getInstance();
foreach ($users as $user_id) {
store_counter_in_db($user_id, $user_counter[$user_id]);
}
Nota: c'è un bug che può impedire di incremento un unico contatore durante singola richiesta in alcune versioni di APC. Incremento in richieste successive non è un problema, per quanto un posso dire.