Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to avoid file deadlocks when PHP process/server crashes?

I am new to PHP. I understand I can use flock() to lock a file and avoid race conditions when two users reach the same php file adding content to the lockable file.

However, what happens if a php process crashes? What happens to the next user waiting for the lockable file? What happens if the server crashes (someone pulls the plug)? Is the lock automatically released? Will the file remain locked after rebooting the server?

To make it short, does PHP make sure such critical situations (i.e., lock not explicitly released) are handled properly? If not, how should one deal with these situations? How to recover from these?

like image 616
Jérôme Verstrynge Avatar asked Jan 19 '12 01:01

Jérôme Verstrynge


1 Answers

Locks are handled by the OS. Therefore:

  • if a process crashes, all locks it held are released (along with any other kind of resource it held)
  • if the system crashes, locks are meaningless because they do not "carry over" to the next reboot

PHP does not need to do anything special other than use the OS-provided mechanism for locking files, so in general you are perfectly safe.

However, if your web server setup is such that each request is not handled by a new process then if one request is abnormally terminated (let's say a thread is aborted) the lock will persist and block all further requests for the lock, quickly resulting in a deadlocked web server. That's one of the many reasons that you really, really should not use setups that do not provide process-level isolation among requests (disclaimer: I am not a web server expert -- I could be wrong in the "should not" part, even though I doubt it).

like image 157
Jon Avatar answered Nov 13 '22 16:11

Jon