2015-12-21 10 views
7

È necessario creare un file di blocco che non possa essere eliminato da altri script o processi. Ho provato questo:Come bloccare un file con i processi esterni

$f = fopen($pidFile, 'w'); 
    fwrite($f, getmypid()); 
    flock($f, LOCK_EX); 

ma qualsiasi altro processo iniziato da parte dell'utente corrente può eliminare il file $f anche se l'handle di file è ancora aperto dallo script in esecuzione. Come risolvere questo problema e impedire ad altri (ad esempio i processi non PHP non PHP) di eliminare il file? E il blocco da rilasciare automaticamente quando il processo termina? Tutte le domande simili si concludono con un gruppo RTM (), ma nessuno di questi risponde come bloccare un file con i processi esterni.

OS è Linux 2.6.32-431.el6.x86_64

+2

"flock" è "advisory", non rigido. Usa [controllo aggiuntivo] (http://stackoverflow.com/questions/20771824/php-test-if-file-is-locked) prima di fare qualsiasi cosa con il file negli script. Questo funzionerà se riguarda i tuoi script PHP. Se si tratta di processi esterni, allora 'flock' non può salvare il caso. –

+1

Come ho accennato nella mia domanda, ho bisogno di bloccare il file per prevenire l'eliminazione da processi esterni (ad esempio non PHP) –

risposta

5

flock su Linux usa "blocco di consulenza" per impostazione predefinita, il che significa che non impedisce qualsiasi altro processo di manipolare quel file. Vedi la nota nel manuale PHP.

flock() utilizza il blocco obbligatorio anziché il blocco di avviso su Windows. Il blocco obbligatorio è supportato anche sui sistemi operativi basati su Linux e System V tramite il solito meccanismo supportato dalla chiamata di sistema fcntl(): cioè, se il file in questione ha il bit di autorizzazione setgid impostato e il bit di esecuzione del gruppo cancellato. Su Linux, il file system dovrà anche essere montato con l'opzione mand affinché funzioni.

vedi anche https://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt

Un file viene contrassegnato come un candidato per il blocco obbligatorio impostando il bit gruppo-id nella sua modalità file ma rimuovendo il bit gruppo-esecuzione. Questa è una combinazione senza significato, , ed è stata scelta dagli implementatori di System V in modo tale da evitare che lo interrompa i programmi utente esistenti.

Si noti che il bit ID di gruppo viene solitamente cancellato automaticamente dal kernel quando viene scritto un file setgid. Questa è una misura di sicurezza. Il kernel è stato modificato per riconoscere il caso speciale di un candidato di blocco obbligatorio e allo astenersi dall'eliminare questo bit. Allo stesso modo il kernel è stato modificato non per eseguire i candidati di blocco obbligatori con i privilegi setgid.

presente, inoltre, l'avvertimento:

Nemmeno root può scavalcare un blocco obbligatorio, in modo da processi di fuga può causare il caos se si bloccano i file cruciali. Il modo per aggirarlo è modificare i permessi del file (rimuovere il bit setgid) prima di provare a leggere o scrivere su di esso.

+1

Grazie per la spiegazione. Ma come implementare questo in PHP per risolvere il mio problema? –

+0

@AlexanderPravdin prova https://books.google.de/books?id = mCpnlNYzqOQC & lpg = PA247 & ots = qAWSgskqZ6 & dq = obbligatorio% 20file% 20locking% 20php & hl = de & pg = PA246 # v = onepage & q = obbligatorio% 20file% 20locking% 20php & f = false – Gordon

+0

Grazie, ma la funzione flock() non blocca i file contro i processi esterni (come posso vedere ciò che è spiegato in questo libro). Ma le pagine 249 e successive sono nascoste e richiedono l'acquisto del libro. –

Problemi correlati