Почему функция file возвращает пустой массив? - PullRequest
1 голос
/ 12 декабря 2010
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);
?>

$ массив пуст, но не должен, потому что файл содержит одну строку.Есть идеи почему?

Ответы [ 3 ]

2 голосов
/ 12 декабря 2010

Потому что list.dat пусто.

fopen with w+

'w +' Открыт для чтения и письма; поместите указатель файла в начале файла и обрежьте файл до нулевой длины. Если файл не существует, попытайтесь создать его.

1 голос
/ 12 декабря 2010

Используя flock(), вы получаете эксклюзивную блокировку файла и после этого хотите прочитать его.Это не работаетВероятно, будет достаточно общей блокировки (никто не сможет изменить файл, пока он заблокирован).

flock($file, LOCK_EX | LOCK_SH);

становится

flock($file, LOCK_SH);
1 голос
/ 12 декабря 2010

Если команда file возвращает false, это означает, что file () не выполнен.Я думаю, что это может быть неудачно, потому что вы уже заблокировали его с помощью вызова flock ()Функция file () не обязательно должна предшествовать fopen ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...