I have a function which receives a filename and a json object to write to a text file.
The object is updated and needs to entirely replace the current contents of the file. Each site visitor has their own file. Multiple rapid changes create a situation where the file is truncated by fopen(file,w+), then not written to as it’s locked. End result is empty file.
I’m sure there’s a standard simply way to do this as it’s such a usual activity. Ideally what I’m looking for is a way to check if a file has a lock before truncating the file with fopen in w+ mode or a way to switch modes.
It seems strange that you would have to truncate the file with fopen() to get a file handle to pass to flock() to check if it’s locked — but you just truncated it, so what’s the point?
Here’s the function I have so far:
function updateFile($filename, $jsonFileData) {
$fp = fopen($filename,"w+");
if (flock($fp, LOCK_EX)) {
fwrite($fp, $jsonFileData);
flock($fp, LOCK_UN);
fclose($fp);
return true;
} else {
fclose($fp);
return false;
}
}
Example #1 from the PHP manual will do what you want with a slight modification. Use the
"c"mode to open the file for writing, create it if it doesn’t exist, and don’t truncate it.Full description of the
"c"mode:It doesn’t look like you need it, but there’s also a corresponding
"c+"mode if you want to both read and write.