我想知道是否有可能,如果可以的话,可以创建一个perl脚本来持续监视一个文件/ db,然后调用一个子例程来执行文本处理。我很确定这可以使用套接字,但是这需要用于在共享主机上运行的网站上的网聊应用程序,而且我不太确定套接字是否会被允许。如何在Perl中异步监视文件?
的基本思路是:
- 创建一个监听聊天文件/数据库
- 当文件与新的消息更新,调用子程序
- 调用的子程序将发送新回消息给浏览器显示
在此先感谢。
我想知道是否有可能,如果可以的话,可以创建一个perl脚本来持续监视一个文件/ db,然后调用一个子例程来执行文本处理。我很确定这可以使用套接字,但是这需要用于在共享主机上运行的网站上的网聊应用程序,而且我不太确定套接字是否会被允许。如何在Perl中异步监视文件?
的基本思路是:
在此先感谢。
许多操作系统运行的服务允许应用程序注册在文件或路径更新时得到通知的请求。这通常称为File Alteration Monitor。查看链接的维基百科页面以查看可用的一些系统。最近的Linux系统使用Inotify,以前使用过Dnotify或gamin。 OS X使用FSEvents。 Windows有一个类似的系统。我不知道任何可以跨所有这些系统使用的模块或机制,但是CPAN上有特定的模块,例如SGI::FAM和File::Tail::FAM。
我会做一个cron作业和一个调用Perl脚本的Makefile。方便的是,您自动获取Perl脚本的atime作为时间戳进行比较,因为脚本的atime在被调用时会更新。
这似乎很有希望,但唉,该网站在共享主机上。 – Hussain 2010-04-18 05:34:42
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.
这听起来并不难,只需用'-M'每隔几秒轮询一次文件。 – 2010-04-15 23:06:26
唯一的问题是,每隔几秒轮询一次该文件可能会使服务器/带宽过载。但是,如果有一种方法只是监视它的时间戳,那不会占用太多资源,我应该考虑一下。 – Hussain 2010-04-15 23:16:09