Come gestisco i dati dei risultati di ricerca di terzi (tramite cache)

0

Ho una funzione di ricerca sul mio sito e sta prendendo dati da 6 diverse risorse di terze parti. Il problema è che richiede troppo tempo per richiedere i dati più e più volte nella pagina dei risultati.

Ho letto per domande come questa su SO riguardo alla sessione che non è una buona scelta, ma per me 'memcache' non è un'opzione, perché il server non ha memcached installato e io ho nessun modo per installarlo ora.

C'è qualche altro approccio per fare questo? L'archiviazione nel database sembra inappropriata perché i dati dipendono dai termini di ricerca richiesti.

Quello che stavo pensando è scrivere un file sul server che funga da cache per questo file, ma non so come vorrei sapere quando cancellarlo dopo.

    
posta reikyoushin 22.05.2013 - 22:10
fonte

3 risposte

1

È possibile memorizzare nella cache i risultati utilizzando il file system per memorizzare i dati. Il sistema Zend Cache è molto carino semplice da configurare e utilizzare .

Sarà necessario convertire i termini di ricerca utilizzati per trasformare la query in una chiave di cache. Praticamente qualsiasi algoritmo di hashing funzionerebbe per questo.

$md5Value = 0;

foreach ($searchTerms as $searchTerm) {
    $md5Value = md5($md5Value.$searchTerm);
}

Si tratta di una minuscola possibilità di una collisione dell'hash in modo che tu possa scegliere di utilizzare gli hash più lunghi / forti rispetto a md5, o anche solo archiviare i termini di ricerca con i risultati della ricerca e ricontrollare che sono gli stessi dopo il recupero dal la cache

class SearchTerms {
    public $term = array();
}

class SearchResult {
    public $result;
} 

class StoredSearch {
    public $searchTerms;//instance of SearchTerms
    public $searchResult; //instance of SearchResult
}

vale a dire. StoredSearch è archiviato anziché solo i risultati della ricerca.

    
risposta data 22.05.2013 - 22:24
fonte
1

c'è anche APC , cache PHP alternativa, è comune nei server PHP di hosting condiviso .

Ha anche la possibilità di definire un timeout per ciascuna variabile. La sintassi è piuttosto semplice.

    <?php
    if (apc_exists($s_lang)) { // array in ram
        $l = apc_fetch($s_lang);
    } else {
        //fetch the resource here. example:
        require_once(__DIR__ . "/" .$s_lang. "/language.php");
        apc_store($s_lang, $l, 60); //save for 1 min.
    }

Tuttavia, se si riavvia il server, i dati vengono persi.

    
risposta data 12.11.2014 - 20:37
fonte
0

Ci sono due metodi che potrebbero essere usati nella cache qui (supponendo di usare solo il file system, come hai detto che Memcache non è disponibile):

Metodo 1: la vita della cache è nota

Se sai per quanto tempo dovrebbe durare il file della cache, allora potresti probabilmente racchiudere il recupero delle informazioni della cache in una chiamata a filemtime prima del recupero. Esempio:

$filepath = './cache/' . md5($params); // path to cache file
$cachelength = 3600; // 1 hour
if (is_file($filepath) && time() - filemtime($filepath) < $cachelength) {
    $response = unserialize(file_get_contents($filepath));
} else {
    $response = fetch_data();
    file_put_content($filepath, serialize($response));
}

Metodo 2: Cache life not known

Se non sai per quanto tempo dovrebbe durare la cache, allora l'altra alternativa sarebbe avere un cronjob (o un'attività pianificata su Windows) che rimuova tutti i file della cache ogni pochi minuti, in modo che la cache sia continuamente essere pulito. Esempio:

*/5 * * * * /bin/rm -f /path/to/cache/*

Oltre alla memorizzazione nella cache, esiste un altro modo per velocizzare le richieste iniziali (supponendo che tutte le richieste siano rese asincrone):

Suggerimento bonus: "Accelera" le richieste iniziali usando curl_multiexec ()

Qualcosa che potresti voler usare è la funzione curl_multiexec * per elaborare tutte le richieste iniziali in parallelo. Ho un wrapper per questa funzionalità su github

    
risposta data 15.08.2013 - 12:57
fonte

Leggi altre domande sui tag