技术开发 频道

用PHP构建一个简易监视引擎

    注意该构造器使用Reflection_Class类来实现该服务和日志类的内在检查-在你试图实例化它们之前。尽管这是不必要的,但是它很好地演示了PHP 5中新的反射(Reflection)API的使用。除了这些类以外,反射API还提供一些类来实现对PHP中几乎任何内部实体(类,方法或函数)的内在检查。

 为了使用你构建的引擎,你仍然需要一些包装代码。监视程序应该会禁止你试图两次启动它-你不需要对每一个事件建立两份消息。当然,该监视程序还应该接收包括下列选项在内的一些选项:

选项
描述
[-f]   
引擎的配置文件的一个位置,默认是monitor.xml
[-n]
 引擎允许的子进程池的大小,默认是5
[-d]
一个停用该引擎的守护功能的标志。在你编写一个把信息输出到stdoutstderr的调试ServiceLogger进程时,这是很有用的。

 下面是最终的监视程序脚本,它分析选项,保证排它性并且运行服务检查:
require_once "Service.inc"; require_once "Console/Getopt.php"; $shortoptions = "n:f:d"; $default_opts = array('n' =5'f' ='monitor.xml'); $args = getOptions($default_opts, $shortoptions,null); $fp = fopen("/tmp/.lockfile""a"); if(!$fp || !flock($fp, LOCK_EX | LOCK_NB)) {  fputs($stderr, "Failed to acquire lock\n");  exit; } if(!$args['d']) {  if(pcntl_fork()) {   exit;  }  posix_setsid();  if(pcntl_fork()) {   exit;  } } fwrite($fp, getmypid()); fflush($fp); $engine = new ServiceCheckRunner($args['f'],$args['n']); $engine->loop();
注意,这个示例使用了定制的getOptions()函数。

  在编写一个适当的配置文件后,你可以按如下方式启动该脚本:

  > ./monitor.php -f /etc/monitor.xml

这可以保护并继续监视直到机器被关掉或该脚本被杀死。

  这个脚本相当复杂,但是仍然存在一些容易改进的地方,这些只好留给读者作为练习之用:

  · 添加一个重新分析配置文件的SIGHUP处理器以便你能够在不启动服务器的情况下改变配置。

  · 编写一个能够登录到一个数据库的ServiceLogger以用于存储查询数据。

  · 编写一个Web前端程序以为整个监视系统提供一种良好的GUI。
0
相关文章