18.24. Locking a File
Problem
You want to have exclusive access to a file to prevent it from being changed while you read or update it. If, for example, you are saving guestbook information in a file, two users should be able to add guestbook entries at the same time without clobbering each other’s entries.
Solution
Use flock( )
to provide advisory locking:
$fh = fopen('guestbook.txt','a') or die($php_errormsg);
flock($fh,LOCK_EX) or die($php_errormsg);
fwrite($fh,$_REQUEST['guestbook_entry']) or die($php_errormsg);
fflush($fh) or die($php_errormsg);
flock($fh,LOCK_UN) or die($php_errormsg);
fclose($fh) or die($php_errormsg);Discussion
The file locking flock( ) provides is called
advisory
file locking because flock( ) doesn’t actually prevent other processes
from opening a locked file, it just provides a way for processes to
voluntarily cooperate on file access. All programs that need to
access files being locked with flock( ) need to
set and release locks to make the file locking effective.
There are two kinds of locks you can set with flock( ): exclusive locks and shared locks. An
exclusive lock
, specified by LOCK_EX
as the second argument to flock( ), can be held
only by one process at one time for a particular file. A
shared lock
, specified by LOCK_SH,
can be held by more than one process at one time for a particular
file. Before writing to a file, you should get an exclusive lock.
Before reading from a file, you should get a shared lock.
To unlock a file, call
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access