2010-12-11 3 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); 
?> 

$ 배열이 비어 있지만 파일에 한 줄이 포함되어서는 안됩니다. 이유가 무엇입니까?함수 파일이 빈 배열을 반환하는 이유는 무엇입니까?

답변

2

된다. 읽기와 쓰기에 대한 열기 '+ w'

fopen with w+

; 파일 포인터를 파일의 시작 부분에 놓고 길이가 0 인 파일을 자릅니다. 파일이 없으면 파일을 만듭니다.

1

file 명령이 false를 반환하면 file()이 실패했음을 의미합니다. 나는 당신이 이미 당신의 무리() 호출에 잠겨 있기 때문에 실패 할 수도 있다고 생각합니다. file() 함수 앞에 fopen()을 사용할 필요는 없습니다.

+0

그는 파일에 쓰기 위해'fopen()'을 호출하고 있습니다. – BoltClock

1

flock()을 사용하면 파일에 단독 잠금을 얻은 다음 해당 파일을 읽고 싶습니다. 그건 작동하지 않습니다. 공유 된 잠금으로 충분할 것입니다 (아무도 파일이 잠긴 동안 파일을 변경할 수 없습니다). list.dat가 비어 있기 때문에

flock($file, LOCK_EX | LOCK_SH); 

flock($file, LOCK_SH); 
관련 문제