Il modo migliore per assicurare l'unicità nel nome del file con php

-1

Mi stavo chiedendo, senza utilizzare alcun tipo di informazione utente (id, nickname, età, ecc.), quale sarebbe il modo migliore per assicurare l'univocità del nome file utilizzando php in un database di grandi dimensioni con alto traffico e molto probabilmente simultaneamente tra molti utenti? Sto usando $file = time() ad esempio, ma vorrei sapere se questo dovrebbe essere sufficiente ogni volta che due utenti possono esaminare questo codice contemporaneamente (su larga scala di grandi dimensioni, 10000 utenti contemporaneamente e la stessa funzione è in esecuzione 200 allo stesso tempo).

    
posta user111671 18.01.2014 - 02:08
fonte

3 risposte

1

Se non vuoi cancellare l'intero file per generare un ID univoco, ti vengono in mente un paio di altri modi:

  • È possibile utilizzare una colonna "incremento automatico" in un database. Ogni inserto ti fornisce un ID univoco, gestito dal database. Quindi basalo su questo.

  • È possibile creare un identificatore univoco dall'ID di sessione esistente o dall'indirizzo IP remoto e dell'ora. Potresti anche usare la dimensione del file. Concatenarli insieme dovrebbe impedire che le collisioni dei nomi dei file abbiano un'affidabilità molto migliore rispetto al semplice utilizzo del tempo.

  • È possibile implementare un altro servizio a processo singolo che distribuisce ID univoci su richiesta. Lo script PHP richiedente richiederebbe un id e attendere fino a quando uno non fosse stato restituito prima di procedere. La sua improbabile distribuzione di ids sarebbe un collo di bottiglia anche a livelli di traffico molto elevati.

risposta data 18.01.2014 - 05:36
fonte
4

Usa un GUID. Questa è la soluzione canonica a questo problema. Vedi link . Anche link .

Un GUID è un identificativo a 128 bit che puoi usare per identificare in modo univoco tutto ciò che ti piace. L'elevato numero di bit riduce il rischio di collisione fino al punto in cui può essere ignorato. Non ne vedrai mai uno.

Trova un algoritmo stimabile o utilizza una funzione di libreria dalle tue librerie esistenti. Una rapida ricerca sul web ha trovato diversi in PHP.

Convertilo in stringa nel solito modo, ad es. {21EC2020-3AEA-1069-A2DD-08002B30309D}. Problema risolto.

    
risposta data 19.01.2014 - 09:34
fonte
0

In termini semplici uno spazio multitasking è qualcosa chiamato atomo, semaforo o spin-lock. Sono in qualche modo diversi l'uno dall'altro e non entrerò nei dettagli di questo, ma sono tutti concetti simili per garantire essenzialmente che solo una cosa alla volta possa accadere nel codice critico. Si basano tutti sul sistema progettato in modo tale che una sola risorsa fisica sia bloccata da un chiamante in modo tale da impedire a chiunque altro di bloccarlo finché il chiamante non lo rilascia. Poi un altro chiamante può bloccarlo mentre fa la cosa "critica". È qualcosa che arriva fino a quando una singola istruzione della CPU è il blocco.

Dopo aver detto tutto questo, mentre è possibile avvicinarsi a questo tipo di blocco assoluto con un valore basato sul tempo, e quindi un'approssimazione di un blocco, il lato negativo è che con l'aumento del numero di processi in esecuzione simultanea, così fa la probabilità di una collisione. Quale penso una delle tue preoccupazioni. Questo è vero indipendentemente dalla risoluzione del tuo orologio.

In termini di prestazioni e scalabilità c'è un grande scambio tra il primo metodo sopra e il secondo, con il primo metodo che crea un collo di bottiglia assoluto che tutti i processi devono passare, e il secondo metodo quasi nessun collo di bottiglia.

Quindi in termini di "miglior modo", bene che dipende ... , se hai bisogno di un blocco veramente assoluto, o se solo un ottimo blocco che può fallire entro una certa probabilità statistica sarà sufficiente.

(Uno dei pezzi più interessanti del software che ho scritto anni fa era il fegato del sistema operativo multitasking. L'accesso al disco era condiviso in comune tra tutte le attività, quindi doveva essere assolutamente single threading alla volta. sezione del codice bloccata il più sottile possibile per mantenere il collo della bottiglia più sbloccato possibile.)

Come nota a margine, c'è un interessante problema correlato all'hardware con la possibile collisione di segnali elettrici che potresti trovare interessante leggere per riflettere la luce sulla tua domanda. Si chiama meta-stabilità .

    
risposta data 18.01.2014 - 03:47
fonte

Leggi altre domande sui tag