- ·上一篇文章:PHP5中PDO的简单使用
- ·下一篇文章:深入探讨PHP中的内存管理问题
用PHP构建一个简易监视引擎
us");
}
}
publicfunctionlog_current_status(ServiceCheck$service)
{
error_log("{$service->description()}:$status");
}
}
该log_current_status()方法意味着,如果进程发送一个SIGUSR1信号,它将把其完整的当前状态复制到你的PHP错误日志中。
该引擎使用如下的一个配置文件:
<config>
<loggers>
<logger>
<id>errorlog</id>
<class>ErrorLog_ServiceLogger</class>
</logger>
<logger>
<id>emailme</id>
<class>EmailMe_ServiceLogger</class>
</logger>
</loggers>
<services>
<service>
<class>HTTP_ServiceCheck</class>
<params>
<description>OmniTIHTTPCheck</description>
<url>http://www.omniti.com</url>
<timeout>30</timeout>
<frequency>900</frequency>
</params>
<loggers>
<logger>errorlog</logger>
<logger>emailme</logger>
</loggers>
</service>
<service>
<class>HTTP_ServiceCheck</class>
<params>
<description>HomePageHTTPCheck</description>
<url>http://www.schlossnagle.org/~george</url>
<timeout>30</timeout>
<frequency>3600</frequency>
</params>
<loggers>
<logger>errorlog</logger>
</loggers>
</service>
</services>
</config>
当传递这个XML文件时,ServiceCheckRunner的构造器对于每一个指定的日志实例化一个日志记录程序。然后,它相应于每一个指定的服务实例化一个ServiceCheck对象。
注意该构造器使用Reflection_Class类来实现该服务和日志类的内在检查-在你试图实例化它们之前。尽管这是不必要的,但是它很好地演示了PHP5中新的反射(Reflection)API的使用。除了这些类以外,反射API还提供一些类来实现对PHP中几乎任何内部实体(类,方法或函数)的内在检查。
为了使用你构建的引擎,你仍然需要一些包装代码。监视程序应该会禁止你试图两次启动它-你不需要对每一个事件建立两份消息。当然,该监视程序还应该接收包括下列选项在内的一些选项:
选项描述 [-f]引擎的配置文件的一个位置,默认是monitor.xml。 [-n]引擎允许的子进程池的大小,默认是5。 [-d]一个停用该引擎的守护功能的标志。在你编写一个把信息输出到stdout或stderr的调试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,"Failedtoacquirelock\n");
exit;
}
if(!$args['d']){
if(pcntl_fork()){
exit;
}
posix_setsid();
if(pcntl_fork()){
exit;
}
}
fwrite($fp,getmypid());
fflush($fp);
$engine=newServiceCheckRunner($args['f'],$args['n']);
$engine->loop();
注意,这个示例使用了定制的getOptions()函数。
在编写一个适当的配置文件后,你可以按如下方式启动该脚本:
>./monitor.php-f/etc/monitor.xml
这可以保护并继续监视直到机器被关掉或该脚本被杀死。
这个脚本相当复杂,但是仍然存在一些容易改进的地方,这些只好留给读者作为练习之用:
·添加一个重新分析配置文件的SIGHUP处理器以便你能够在不启动服务器的情况下改变配置。
·编写一个能够登录到一个数据库的ServiceLogger以用于存储查询数据。
·编写一个Web前端程序以为整个监视系统提供一种良好的GUI。
}
}
publicfunctionlog_current_status(ServiceCheck$service)
{
error_log("{$service->description()}:$status");
}
}
该log_current_status()方法意味着,如果进程发送一个SIGUSR1信号,它将把其完整的当前状态复制到你的PHP错误日志中。
该引擎使用如下的一个配置文件:
<loggers>
<logger>
<id>errorlog</id>
<class>ErrorLog_ServiceLogger</class>
</logger>
<logger>
<id>emailme</id>
<class>EmailMe_ServiceLogger</class>
</logger>
</loggers>
<services>
<service>
<class>HTTP_ServiceCheck</class>
<params>
<description>OmniTIHTTPCheck</description>
<url>http://www.omniti.com</url>
<timeout>30</timeout>
<frequency>900</frequency>
</params>
<loggers>
<logger>errorlog</logger>
<logger>emailme</logger>
</loggers>
</service>
<service>
<class>HTTP_ServiceCheck</class>
<params>
<description>HomePageHTTPCheck</description>
<url>http://www.schlossnagle.org/~george</url>
<timeout>30</timeout>
<frequency>3600</frequency>
</params>
<loggers>
<logger>errorlog</logger>
</loggers>
</service>
</services>
</config>
当传递这个XML文件时,ServiceCheckRunner的构造器对于每一个指定的日志实例化一个日志记录程序。然后,它相应于每一个指定的服务实例化一个ServiceCheck对象。
注意该构造器使用Reflection_Class类来实现该服务和日志类的内在检查-在你试图实例化它们之前。尽管这是不必要的,但是它很好地演示了PHP5中新的反射(Reflection)API的使用。除了这些类以外,反射API还提供一些类来实现对PHP中几乎任何内部实体(类,方法或函数)的内在检查。
为了使用你构建的引擎,你仍然需要一些包装代码。监视程序应该会禁止你试图两次启动它-你不需要对每一个事件建立两份消息。当然,该监视程序还应该接收包括下列选项在内的一些选项:
下面是最终的监视程序脚本,它分析选项,保证排它性并且运行服务检查:
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,"Failedtoacquirelock\n");
exit;
}
if(!$args['d']){
if(pcntl_fork()){
exit;
}
posix_setsid();
if(pcntl_fork()){
exit;
}
}
fwrite($fp,getmypid());
fflush($fp);
$engine=newServiceCheckRunner($args['f'],$args['n']);
$engine->loop();
注意,这个示例使用了定制的getOptions()函数。
在编写一个适当的配置文件后,你可以按如下方式启动该脚本:
>./monitor.php-f/etc/monitor.xml
这可以保护并继续监视直到机器被关掉或该脚本被杀死。
这个脚本相当复杂,但是仍然存在一些容易改进的地方,这些只好留给读者作为练习之用:
·添加一个重新分析配置文件的SIGHUP处理器以便你能够在不启动服务器的情况下改变配置。
·编写一个能够登录到一个数据库的ServiceLogger以用于存储查询数据。
·编写一个Web前端程序以为整个监视系统提供一种良好的GUI。
