Как я могу асинхронно контролировать файл в Perl?

Я задаюсь вопросом, возможно ли, и раз так как, можно было создать сценарий жемчуга, который постоянно контролирует файл/дб, и затем назовите подпрограмму для выполнения обработки текста, если файл изменяется. Я вполне уверен, это было бы возможными сокетами использования, но это должно использоваться для приложения веб-чата на сайте, работающем на общем хосте, и я не настолько верные сокеты, был бы позволен на нем.

Основная идея:

  • создайте слушателя для файла/базы данных чата
  • когда файл будет обновлен с новым сообщением, назовите подпрограмму
  • названная подпрограмма передаст новое сообщение обратно браузеру, который будет отображен

Заранее спасибо.

7
задан brian d foy 16 April 2010 в 03:59
поделиться

3 ответа

Многие операционные системы запускают службу, которая позволяет приложениям регистрировать запрос, чтобы получать уведомления об обновлении файла или пути. Обычно это называется Монитор изменения файлов . См. Связанную страницу википедии для некоторых доступных систем. Последние системы Linux используют Inotify, ранее использовались Dnotify или gamin. OS X использует FSEvents. В Windows аналогичная система. Я не знаю ни одного модуля или механизма, который бы работал кросс-платформенным для всех этих систем, но есть определенные модули, доступные на CPAN, такие как SGI :: FAM и File :: Tail :: FAM .

8
ответ дан 7 December 2019 в 01:18
поделиться
use POE qw(Wheel::FollowTail);
POE::Session->create(
    inline_states => {
      _start => sub {
        $_[HEAP]{tailor} = POE::Wheel::FollowTail->new(
          Filename => "/var/log/thttpd.log",
          InputEvent => "got_log_line",
          ResetEvent => "got_log_rollover",
        );
      },
      got_log_line => sub {
        #print "Log: $_[ARG0]\n";
        parseline($_[ARG0]);
      },
      got_log_rollover => sub {
        #print "Log rolled over.\n";
      },
    }
  );

POE::Kernel->run();
exit;

#parseline()...etc.
1
ответ дан 7 December 2019 в 01:18
поделиться

Я бы сделал это с помощью задания cron и Makefile, который запускал сценарий Perl. Удобно то, что вы автоматически получаете время скрипта Perl в качестве метки времени для сравнения, поскольку время скрипта обновляется при его вызове.

1
ответ дан 7 December 2019 в 01:18
поделиться
Другие вопросы по тегам:

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