Re: is fwrite atomic?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



As the subject mentions, is fwrite method atomic in PHP? What I mean
by that is, does fwrite function acquire an implicit lock while
writing or do I need to explicitly acquire an EXCLUSIVE lock on the
file before I call fwrite?

While I haven't checked, I would imagine the answer is NO.

The problem I am having is that, I want to track user requests by
logging simple request parameters such as user IP, request URI, etc.
instead of inserting into the db for avoiding overheads. And I will
have a cronjob read this data around midnight and write it into the
database (when there is little load on the server).

So, the questions I have is:

1. While writing this information, do I need to get an exclusive lock
before writing? Say I have a 200 bytes string, and 2 people call
fwrite at the same time with 2 strings, will they be written
sequentually or will it mix these strings depending on the O/S IO
buffer size.

I certainly would. I don't know how the data will get written out in simultaneous writes. I would guess it involves filesystem options, what OS, kernel buffers, etc...


Just create a "data.lock" file, open that, flock it, do your write, and close everything.

2. While I am inserting this data into the database, I will have to
lock the file, dump them into the database and empty it. So, this
might make some users wait, which is something I am trying to avoid.
But, in anycase I will need to have a secondary lock object which
controls access to this log I guess, i.e. acquire secondary lock,
rename the file to .tmp or something, release the lock, and in the
meantime read from .tmp, parse it and put it in the db.

I'd lock your data.lock file, move your actual data file, create an empty new data file, remove the lock, then process your local copy.


You might also consider using syslog to send things there, but that might be more messy then it's worth...

-philip

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux