2010-12-11 16 views
1
Done 
<?php 
    define('FILE_NAME', 'list.dat'); 
    define('MAX_BREAK', 30); 

    function write($file, $ip, $time) 
    { 
     fwrite($file, $ip . '|' . $time . "\n"); 
    } 

    $new_ip = /*$REMOTE_ADDR*/ $_SERVER['REMOTE_ADDR']; 
    $file = fopen(FILE_NAME, 'w+'); 
    flock($file, LOCK_EX | LOCK_SH); 

    $array = file(FILE_NAME, FILE_IGNORE_NEW_LINES); 
    $contains = false; 
    foreach ($array as $record) 
    { 
     $values = explode('|', $record); 
     $ip = $values[0]; 
     $time = $values[1]; 
     if ($ip == $new_ip) 
     { 
      $time = time(); 
      $contains = true; 
     } 
     if (time() - $time < MAX_BREAK) 
      write($file, $ip, $time); 
    } 
    if (!$contains) 
     write($file, $new_ip, time()); 

    flock($file, LOCK_UN); 
    fclose($file); 
?> 

$ arrayは空ですが、fileには1行が含まれているため、この配列は空ではありません。 アイデアは何故ですか?関数ファイルが空の配列を返すのはなぜですか?

答えて

2

になります。読み書き用にオープン '+ W'

fopen with w+

。ファイルポインタをファイルの先頭に置き、ファイルをゼロ長に切り捨てます。ファイルが存在しない場合は、作成してください。

1

fileコマンドがfalseを返す場合、file()が失敗したことを意味します。私はあなたがすでにあなたのflock()呼び出しでロックされているので、失敗していると思います。 file()関数の前にfopen()を付ける必要はありません。

+0

彼はファイルに書き込むために 'fopen()'を呼び出しています。 – BoltClock

1

flock()を使用すると、ファイルを排他的にロックすることができます。それは動作しません。おそらく共有ロックで十分です(ロックされている間に誰もファイルを変更できません)。

flock($file, LOCK_EX | LOCK_SH); 

list.datが空であるため

flock($file, LOCK_SH); 
関連する問題