Re: PHP Problem When Opening Same File?

Hi --
Try the flock command in php -- look up flock() in the php docs. That is what I 
use in my counter.
flock will lock a file temporarily to prevent simultaneous access. however, it 
seems I read somewhere that flock is not honored on some servers -- whether 
that has been fixed yet I don't know. So if you do use flock, your code may not 
be portable.

Another safer method is to use a database manager like mysql, which will 
coordinate access for you without any extra overhead.

Below is the modified code for a counter using flock that I got from "Jeff the 
Ultra guy":

counter.txt (the data file):
71.68.74.86
7


counter.inc:
<? 
//Copyright 2003 by Anoetic Concepts - www.AnoeticConcepts.com
//Change the file name in the next line to match your counter file. 
$cfile = "cgi-bin/counter.txt"; //Default: counter.dat
//Do you want the count displayed or just incremented? 
$displaycount = 1; //1=display, 0=increment only

$localip = "127.0.0.1"; 
if ( ($fp = fopen ($cfile,"r+")) && flock($fp,LOCK_EX) ) {
    $ip = fgets ($fp,17); // fgets reads len - 1 and newline must be read 
    $ip = chop ($ip); 
    $count = fgets ($fp,10); 
    if ($REMOTE_ADDR == $localip) 
        $np = $ip; 
    else 
        $np = $REMOTE_ADDR; 
if ($np != $ip) 
    $count += 1; 
$np = sprintf ("%-15s\n", $np);
rewind ($fp); 
fputs ($fp,$np,16); 
fputs ($fp,$count,10); 
fclose ($fp); 
if ($displaycount) 
echo $count; 
} 
?>


  ----- Original Message ----- 
  From: Bryan Garaventa 
  To: programmingblind@xxxxxxxxxxxxx 
  Sent: Wednesday, January 02, 2008 11:20 PM
  Subject: PHP Problem When Opening Same File?


  Is it possible to query a file on the server to see if it's already opened by 
another script?

  My problem is this...

  I have a variable that is dynamically updated by a script, which increments a 
counter each time the page loads. 

  However, if two people simultaniously trigger the script to run at virtually 
the same moment, which has just recently happened, the first instance of the 
script takes the variable, opens the file and then writes the new value into 
the file, then closes it. At the same time, the second instance of the script 
is trying to access the same file, and finding no file (since it's already 
opened by the other instance), the counter defaults to zero, and that is then 
written in the new file instead of the incremented value.

  All of which totally screws up the counter.

  So, is there a way that I can check if the file is already open before having 
the script try to open the file and write new data to it?

  Thanks,

  Bryan


Other related posts: