2012-06-29 16 views
10

So che il mio file system memorizza il tempo di modifica del file in millisecondi ma non conosco un modo per accedere a tali informazioni tramite PHP. Quando faccio un ls --full-time vedo questo:Ottieni un lungo elenco di file, ordinati per il tempo di file in * millisecondi *

-rw-r--r-- 1 nobody nobody 900 2012-06-29 14:08:37.047666435 -0700 file1 
-rw-r--r-- 1 nobody nobody 900 2012-06-29 14:08:37.163667038 -0700 file2 

sto supponendo che i numeri dopo il punto sono i millisecondi.

Così mi rendo conto che potrei semplicemente usare ls e lo hanno ordina per data di modifica, in questo modo:

$filelist = `ls -t`; 

Tuttavia, la directory a volte ha un numero enorme di file e ho notato che ls può essere abbastanza lento in quelle circostanze.

Quindi, invece, ho utilizzato find ma non ha un interruttore per ordinare i risultati per ora di modifica. Ecco un esempio di quello che sto facendo ora:

$filelist = `find $dir -type f -printf "%[email protected] %p\n" | sort -n | awk '{print $2}'`; 

E, naturalmente, questo non lo fa sort ai millisecondi quindi i file che sono stati creati nello stesso secondo a volte sono elencati in ordine errato.

+1

Perché 'sort -n' non ordina i millisecondi? Sembrerebbe che due timestamp '1341013506.3000000000' e' 1341013506.6000000000' siano ordinati numericamente ancora no? Non riesco a replicare perché la mia macchina non memorizza i tempi dei file ms :) –

+1

@mattedgod: controlla la directory '/ sys /'; sul mio sistema, supporta i tempi di nanosecondo. – sarnold

+0

@sarnold Hmm che è strano, la directory sys è in nanosecondi ma la maggior parte delle directory dei documenti non lo sono. Interessante ... –

risposta

6

Solo pochi filesystem (come EXT4) memorizzano effettivamente questi tempi con precisione fino a un nanosecondo. Non è qualcosa che è garantito che sia disponibile, su altri file system (come EXT3) noterai che la parte frazionaria è .000000000

Ora, se questa funzione è davvero importante per te, potresti scrivere un'estensione PHP specializzata. Ciò ignorerà le chiamate alle utilità esterne e dovrebbe essere molto più veloce. Il processo di creazione dell'estensione è ben spiegato in molti punti, come here. Un approccio ragionevole a tale estensione potrebbe essere un'implementazione di una funzione fstat alternativa che esponga i campi di alta precisione disponibili nella struttura stat definita in /usr/include/bits/stat.h al giorno d'oggi.

Come al solito, niente è gratuito. Questa estensione dovrà essere mantenuta, probabilmente non è possibile farlo girare su ambienti ospitati, ecc. Inoltre, la tua soluzione php verrà eseguita solo sui server in cui è stata distribuita l'estensione (anche se ciò può essere aggirato ricadendo sulla tecnica basata su ls se l'estensione non viene rilevata).

+0

. Ho avuto la sensazione che non ci sarebbe stata una soluzione semplice a questo. Grazie per aver condiviso i vostri pensieri. :-) – Jeremy

Problemi correlati