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
Get PHP Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.