Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Перезагрузка информации о файле / 8 сообщений из 8, страница 1 из 1
12.01.2016, 19:31
    #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
12.01.2016, 22:26
    #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
12.01.2016, 22:27
    #39145946
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезагрузка информации о файле
Вопрос в том, можно ли как-то без переоткрывания файла сделать, или в этом ничего страшного?
...
Рейтинг: 0 / 0
13.01.2016, 09:32
    #39146085
SharuPoNemnogu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезагрузка информации о файле
А нельзя сразу прокинуть в евент внесенные данные? Или файл меняется не в коде
...
Рейтинг: 0 / 0
13.01.2016, 09:53
    #39146109
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезагрузка информации о файле
Файл меняется другим процессом (логи пишутся туда)
Мне нужно что-то типа fail -f с передачей каждой строки в коллбэк
...
Рейтинг: 0 / 0
13.01.2016, 10:34
    #39146142
SharuPoNemnogu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезагрузка информации о файле
думаю логичнее ставить курсор с конца файла, а не с начала, тем более если файл большой. Что то типа
Код: php
1.
fseek($fp, ($lastSize - $currentSize), SEEK_END);
...
Рейтинг: 0 / 0
15.01.2016, 09:39
    #39147936
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезагрузка информации о файле
Ну да, тоже про это думал. Спс)
...
Рейтинг: 0 / 0
15.01.2016, 09:40
    #39147938
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перезагрузка информации о файле
Можно еще после fclose слип небольшой сделать, на секунду например, тогда при большом потоке данных файл не будет переоткрываться на каждую новую строчку.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Перезагрузка информации о файле / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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