2012-01-19 14 views
5

Sono nuovo di PHP. Capisco che posso usare flock() per bloccare un file ed evitare le condizioni di gara quando due utenti raggiungono lo stesso file php aggiungendo contenuto al file bloccabile.Come evitare i deadlock dei file quando il processo/server PHP si arresta in modo anomalo?

Tuttavia, cosa succede se un processo php si arresta in modo anomalo? Cosa succede al prossimo utente che aspetta il file bloccabile? Cosa succede se il server si blocca (qualcuno si disconnette)? Il blocco viene rilasciato automaticamente? Il file rimarrà bloccato dopo il riavvio del server?

Per farla breve, PHP si assicura che tali situazioni critiche (vale a dire il blocco non esplicitamente rilasciato) siano gestite correttamente? In caso negativo, come si dovrebbe affrontare queste situazioni? Come recuperare da questi?

risposta

5

I blocchi vengono gestiti dal sistema operativo. Pertanto:

  • Se un processo si blocca, tutte le serrature si terrà vengono rilasciati (insieme a qualsiasi altro tipo di risorsa ha tenuto)
  • se il sistema si blocca serrature sono inutile perché essi non "riporto" per il prossimo riavvio

PHP non ha bisogno di fare niente di speciale se non usare il meccanismo fornito dal sistema operativo per bloccare i file, quindi in generale sei perfettamente al sicuro.

Tuttavia, se la configurazione del server web è tale che ogni richiesta non viene gestita da un nuovo processo, allora se uno richiesta viene terminata in modo anomalo (diciamo un thread è interrotta) il blocco persisterà e bloccare tutte le ulteriori richieste di il blocco, che si traduce rapidamente in un server Web con deadlock. Questa è una delle molte ragioni per cui davvero, davvero non dovresti usare configurazioni che non forniscono l'isolamento a livello di processo tra le richieste (disclaimer: non sono un esperto di web server - potrei sbagliarmi nella parte "should not", anche se ne dubito).

Problemi correlati