Re: How to make sure that the target file to read is not under writing by others?

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

 



On Wed, 19 Aug 2009 08:13:56 -0400, kyle.smith@xxxxxxxxxxxxxx (Kyle Smith) wrote:

>Nitebirdz wrote:
>> On Wed, Aug 19, 2009 at 11:59:39AM +0100, Ashley Sheridan wrote:
>>   
>>>  
>>> No, what you're saying is 'use a log file in order to know when to look
>>> at another log file'. What would happen if you tried to access the
>>> control log file whilst it was in the process of being written to?
>>> Admittedly, you reduce your chances of failure because there is less
>>> data being written to the control log than the actual log, but the
>>> chance of reading incomplete data is still there!
>>>
>>>     
>>
>> WARNING: total newbie here.
>>
>> If I understood Arno correctly, he was recommending to implement
>> something like the old "/var/run/*pid" files in UNIX.  That way, you can
>> control whether or not the previous run is already done with the file
>> before you move on. 
>That is definitely the correct approach.  Have the script which copies 
>the log file touch a file called 'log_file.write' or some such.  When 
>it's done, remove the file.  Your PHP script should exit if that file 
>exists.  Of course, given the 30 minute cron cycle, it would then have 
>to wait until the next cycle.  Maybe run it more often.

I gather from this discussion that PHP allows two users to open a file for R/W? I had
assumed it wouldn't.

Anyway, how about:

	$user = 'Fred'; $try_again = true;
	If (!file_exists('Busy.txt'))
		{
		File_put_contents ('Busy.txt', $user);
		If ($user == File_get_contents ('Busy.txt')
			{
// Do what you have to
			Unlink ('Busy.txt');
			$try_again = false;
			}
		}
	if ($try_again)
		{
// Come back in 5 minutes
		}

This has a theoretical weakness, in that Joe could check for Busy.txt in the interval
between your checking and writing it, and then write his copy after you had read your
copy. A moments delay between writing and re-reading would fix this.


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