|
Posted by Philip Hallstrom on 10/19/10 11:13
> 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
[Back to original message]
|