10.2.1 Problem
10.2.2 Solution
Use a text file with advisory locking to prevent conflicts. You
can store data in the text file in any useful format (CSV, pipe-delimited, etc.)
One convenient way is to put all the data you want to store in one variable (a
big associative array) and then store the output of calling serialize(
) on the variable:
$data_file = '/tmp/data';
// open the file for reading and writing
$fh = fopen($data_file,'a+') or die($php_errormsg);
rewind($fh) or die($php_errormsg);
// get an exclusive lock on the file
flock($fh,LOCK_EX) or die($php_errormsg);
// read in and unserialize the data
$serialized_data = fread($fh,filesize($data_file)) or die($php_errormsg);
$data = unserialize($serialized_data);
/*
* do whatever you need to with $data ...
*/
// reserialize the data
$serialized_data = serialize($data);
// clear out the file
rewind($fh) or die($php_errormsg);
ftruncate($fp,0) or die($php_errormsg);
// write the data back to the file and release the lock
if (-1 == (fwrite($fh,$serialized_data))) { die($php_errormsg); }
fflush($fh) or die($php_errormsg);
flock($fh,LOCK_UN) or die($php_errormsg);
fclose($fh) or die($php_errormsg);
10.2.3 Discussion
Storing your data in a text file doesn't require any additional
database software to be installed, but that's pretty much its only advantage.
Its main disadvantages are clumsiness and inefficiency. At the beginning of a
request, you've got to lock your text file and haul out all your data from it,
even if you're only using a little bit of the data. Until you unlock the file at the end of the request, all
other processes have to wait around, doing nothing, which means all your users
are waiting too. One of the great assets of databases is that they give you
structured access to your data, so you only lock (and load into memory) the data
you actually care about. The text file solution doesn't do that.
What's worse,
the locking you can do with a text file isn't nearly as robust as what you can
do with a database. Because flock( ) provides a
kind of file locking called advisory locking, the only thing that prevents
multiple processes from stepping on each other and trashing your data is
politeness and diligent programming. There's no guarantee your data is safe from
an innocently incompetent or intentionally malicious program.