Il file system frequente scrive in PHP durante la serializzazione di oggetti

1

Sto costruendo un gioco basato su PHP e MySQL. C'è una modalità giocatore-vs-giocatore, ma ho pensato che dovrei aggiungere anche una modalità giocatore-computer, dal momento che i giocatori potrebbero non essere sempre online, specialmente all'inizio.

È un tipo di combattimento in cui i giocatori hanno fino a due personaggi e possono combattere a turno.

Ho deciso di salvare le unità del computer sul filesystem anziché in un database. Ci sono diversi campi di mostri che i giocatori possono attaccare. Se più giocatori attaccano lo stesso campo, vengono create istanze separate.

Tuttavia, quello su cui ho dei dubbi è se dovrei salvare le informazioni complete sull'unità nell'istanza o solo le proprietà che possono cambiare nel corso della battaglia. Lasciatemi fare un esempio.

Ecco la classe dell'unità

class Unit {
    // Generic
    protected $id = null;
    public function getID(){ return $this->id; }

    public $owner = null;
    public $name;

    // Vitality
    public $HP          = 100;
    public $HPmax       = 100;
    public $energy      = 100;
    public $NRGmax      = 100;

    // Physical
    public $strength    = 0;
    public $endurance   = 0;

    // Psychical
    public $knowledge   = 0;
    public $wisdom      = 0;

   // ...
}

Ed ecco come appare la struttura del file

/PvC/prototypes/
/PvC/clones/

nei prototipi vengono salvate le impostazioni preimpostate delle singole unità, mentre nei cloni vengono salvate le istanze in cui i giocatori stanno combattendo al momento. Come funziona al momento è in cloni. Io risparmio serialize($computer->units) che inserisce la completa informazione completa dell'unità. La mia preoccupazione è che alcune proprietà, come il nome, il proprietario e gli altri, non cambieranno mai durante la battaglia, quindi riscriverle ogni volta è praticamente inutile. E il file di istanza viene riscritto abbastanza spesso, direi, con quasi ogni singola richiesta durante la battaglia.

Per evitare la sovrascrittura continua, potrei serializzare solo le proprietà che possono cambiare durante la battaglia e quindi caricare l'unità dal prototipo così com'è, quindi sovrascriverla con le proprietà del clone. Tuttavia, il problema è che sto caricando due file anziché uno, quindi caricando un gruppo di dati dal primo file che non userò e che verrà sovrascritto.

So che non è davvero qualcosa che potrebbe importare, dato che le dimensioni del file raramente superano i 10kb. Cosa ne pensi su questo?

    
posta php_nub_qq 19.07.2014 - 18:58
fonte

1 risposta

1

Penso che sia meglio mettere i dati delle unità nel database e non nei file. Non consiglierei di serializzare gli oggetti. Basta creare una tabella MySQL con campi come hp, strength, endurance ecc. Quindi puoi aggiornare solo i campi che sono cambiati durante il round della battaglia. Se non si prevede di utilizzare alcun programma di analisi relazionale oggetto (come Propel o Doctrine), è possibile avere una matrice per tracciare i campi modificati. Codice di esempio:

class Unit {
    private $id;

    private $hp;  //sorry, you will have to make it private
    ...

    private $changedFields = array();

    public function setHp($value)
    {
        $this->changedFields['hp'] = true;
        $this->hp = $value;
    }

    //i'm using active record pattern here, which may not be a good idea; this is just an example
    public function save()
    {
        if (empty($this->changedFields)) {
            return; //nothing to save
        }

        //build the MySQL query
        $dataToWrite = array();
        foreach($this->changedFields as $name => $temp) {
            $dataToWrite[] = "$name={$this->$name}"; //TODO: escape
        }
        mysql_query("UPDATE units SET " . implode(',', $dataToWrite) . " WHERE id={$this->id}");
    }
}

Quindi chiama save () su ogni oggetto della classe Unit.

Sarebbe meglio usare un gestore di entità che tenga traccia delle modifiche e scriva i dati nel database in una query più ottimizzata.

    
risposta data 20.10.2014 - 00:26
fonte

Leggi altre domande sui tag