Using Text file as database in PHP

By: David Sklar and Adam Trachtenberg  

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. 

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);

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.

Archived Comments

Most Viewed Articles (in PHP )

Get the next working day in PHP

__autoload() METHOD in PHP

Execution Lifetime of a PHP script

Decrypting files using GnuPG (GPG) via PHP

Encrypting files using GnuPG (GPG) via PHP

Error: Length parameter must be greater than 0

PHP Warning: Unknown(): Unable to load dynamic library '/usr/local/php4/lib/php/extensions/no-debug ......

Function to return number of digits of an integer in PHP

Function to sort array by elements and count of element in PHP

Function to force strict boolean values in PHP

Running different websites on different versions of PHP in Windows 2003 & IIS6 platform


Installing PHP 5.x with Apache 2.x on HP UX 11i and configuring PHP 5.x with Oracle 9i

Setting up PHP in Windows 2003 Server IIS7, and WinXP 64

Cannot load /usr/local/apache/libexec/ into server:

Latest Articles (in PHP)

Comment on this tutorial