Как я могу асинхронно контролировать файл в Perl? - PullRequest
7 голосов
/ 16 апреля 2010

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 16 апреля 2010

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

1 голос
/ 16 апреля 2010
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 голос
/ 16 апреля 2010

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

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