powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Перезагрузка информации о файле
8 сообщений из 8, страница 1 из 1
Перезагрузка информации о файле
    #39145853
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необходимо при добавлении новых строк в файл, вызывать колбэк функцию, сделал так:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
function tail($file, $callback)
{
    $fp = fopen($file, 'a');
    fseek($fp, filesize($file));

    $fd = inotify_init();
    $watch_descriptor = inotify_add_watch($fd, $file, IN_ALL_EVENTS);

    while (true) {
        $events = inotify_read($fd);
        foreach ($events as $event => $evdetails) {
            // React on the event type
            switch (true) {
                // File was modified
                case ($evdetails['mask'] & IN_MODIFY):
                    // read until EOF
                    while (!feof($fp)) {
                        $line = fgets($fp);
                        $offset = ftell($fp);
                        fclose($fp);
                        $fp = fopen($file, 'r');
                        fseek($fp, $offset);
                        $callback($line);
                    }
                    break;
                // File was moved or deleted
                case ($evdetails['mask'] & IN_MOVE):
                case ($evdetails['mask'] & IN_MOVE_SELF):
                case ($evdetails['mask'] & IN_DELETE):
                case ($evdetails['mask'] & IN_DELETE_SELF):
                    // Stop watching $file for changes
                    inotify_rm_watch($fd, $watch_descriptor);
                    // Close the inotify instance
                    fclose($fd);
                    break;
            }
        }
    }
}



Как бэ работает, но не нравится:

Код: plaintext
1.
2.
3.
                        $offset = ftell($fp);
                        fclose($fp);
                        $fp = fopen($file, 'r');
                        fseek($fp, $offset);

Как будет вести себя на больших файлах fseek ?
Можно ли это как-то более корректно сделать?
...
Рейтинг: 0 / 0
Перезагрузка информации о файле
    #39145945
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чет нагородил там что попало, вот более корректный код:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
function tail($file, $callback)
{
    $pos = filesize($file);

    $fd = inotify_init();
    $watch_descriptor = inotify_add_watch($fd, $file, IN_ALL_EVENTS);

    while (true) {
        $events = inotify_read($fd);
        foreach ($events as $event => $evdetails) {
            // React on the event type
            switch (true) {
                // File was modified
                case ($evdetails['mask'] & IN_MODIFY):
                    // read until EOF
                    $fp = fopen($file, 'r');
                    fseek($fp, $pos);
                    while (($line = fgets($fp)) !== false) {
                        $callback($line);
                    }
                    $pos = ftell($fp);
                    fclose($fp);
                    break;
                // File was moved or deleted
                case ($evdetails['mask'] & IN_MOVE):
                case ($evdetails['mask'] & IN_MOVE_SELF):
                case ($evdetails['mask'] & IN_DELETE):
                case ($evdetails['mask'] & IN_DELETE_SELF):
                    // Stop watching $file for changes
                    inotify_rm_watch($fd, $watch_descriptor);
                    // Close the inotify instance
                    fclose($fd);
                    break;
            }
        }
    }
}
...
Рейтинг: 0 / 0
Перезагрузка информации о файле
    #39145946
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос в том, можно ли как-то без переоткрывания файла сделать, или в этом ничего страшного?
...
Рейтинг: 0 / 0
Перезагрузка информации о файле
    #39146085
SharuPoNemnogu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нельзя сразу прокинуть в евент внесенные данные? Или файл меняется не в коде
...
Рейтинг: 0 / 0
Перезагрузка информации о файле
    #39146109
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Файл меняется другим процессом (логи пишутся туда)
Мне нужно что-то типа fail -f с передачей каждой строки в коллбэк
...
Рейтинг: 0 / 0
Перезагрузка информации о файле
    #39146142
SharuPoNemnogu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю логичнее ставить курсор с конца файла, а не с начала, тем более если файл большой. Что то типа
Код: php
1.
fseek($fp, ($lastSize - $currentSize), SEEK_END);
...
Рейтинг: 0 / 0
Перезагрузка информации о файле
    #39147936
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, тоже про это думал. Спс)
...
Рейтинг: 0 / 0
Перезагрузка информации о файле
    #39147938
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще после fclose слип небольшой сделать, на секунду например, тогда при большом потоке данных файл не будет переоткрываться на каждую новую строчку.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Перезагрузка информации о файле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]