Как наблюдать, что файл пишет в PHP?

Как Митч и другие , вы не должны поймать исключение, которое вы не планируете обрабатывать каким-либо образом. Вы должны учитывать, как приложение будет систематически обрабатывать исключения при разработке. Это обычно приводит к тому, что уровни обработки ошибок основаны на абстракциях - например, вы обрабатываете все ошибки, связанные с SQL, в своем коде доступа к данным, так что часть приложения, взаимодействующая с объектами домена, не подвержена тому факту, что где-то есть БД под капотом.

Есть несколько связанных запахов кода, которые вы определенно хотите избежать, в дополнение к запаху «лови все везде» .

  1. «catch, log, rethrow» : если вы хотите вести журнал на основе границ, то напишите класс, который выдает оператор log в своем деструкторе, когда стек разворачивается из-за исключение (аля std::uncaught_exception()). Все, что вам нужно сделать, это объявить экземпляр журнала в интересующей вас области, и, вуаля, у вас есть протоколирование и нет ненужной логики try / catch.

  2. «поймай, брось переведено» : обычно это указывает на проблему абстракции. Если вы не внедряете федеративное решение, в котором вы переводите несколько конкретных исключений в одно более общее, вы, вероятно, имеете ненужный уровень абстракции ... и не говорите, что "оно может понадобиться мне завтра" .

  3. «поймать, очистить, отбросить» : это одна из моих любимых мозолей. Если вы видите многое из этого, вам следует применить методы «Приобретение ресурсов - инициализация» и поместить часть очистки в деструктор экземпляра объекта janitor . [ тысячу сто двадцать четыре]

Я считаю код, усеянный блоками try / catch, хорошей целью для проверки и рефакторинга кода. Это указывает на то, что либо обработка исключений не совсем понятна, либо код стал am'ba и нуждается в серьезном рефакторинге.

16
задан freddiefujiwara 9 July 2009 в 06:55
поделиться

3 ответа

Я не верю, что есть какой-то волшебный способ сделать это. Вам просто нужно постоянно проверять размер файла и выводить любые новые данные. На самом деле это довольно просто, и единственное, на что следует обращать внимание, это то, что размеры файлов и другие статистические данные кэшируются в php. Чтобы решить эту проблему, вызовите clearstatcache () перед выводом каких-либо данных.

Вот небольшой пример, который не включает никакой обработки ошибок:

function follow($file)
{
    $size = 0;
    while (true) {
        clearstatcache();
        $currentSize = filesize($file);
        if ($size == $currentSize) {
            usleep(100);
            continue;
        }

        $fh = fopen($file, "r");
        fseek($fh, $size);

        while ($d = fgets($fh)) {
            echo $d;
        }

        fclose($fh);
        $size = $currentSize;
    }
}

follow("file.txt");
24
ответ дан 30 November 2019 в 16:05
поделиться

Вместо опроса файлов вы регулярно проверяете время изменения файла: filemtime

2
ответ дан 30 November 2019 в 16:05
поделиться
$handler = fopen('somefile.txt', 'r');

// move you at the end of file
fseek($handler, filesize( ));
// move you at the begining of file
fseek($handler, 0);

И, вероятно, вы захотите рассмотреть возможность использования stream_get_line

2
ответ дан 30 November 2019 в 16:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: