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