用PHP构建一个简易监视引擎
AILURE = 0; const SUCCESS = 1; protected $timeout = 30; protected $next_attempt; protected $current_status = ServiceCheck::SUCCESS; protected $previous_status = ServiceCheck::SUCCESS; protected $frequency = 30; protected $description; protected $consecutive_failures = 0; protected $status_time; protected $failure_time; protected $loggers = array(); abstract public function __construct($params); public function __call($name, $args) { if(isset($this->$name)) { return $this->$name; } } public function set_next_attempt() { $this->next_attempt = time() + $this->frequency; } public abstract function run(); public function post_run($status) { if($status !== $this->current_status) { $this->previous_status = $this->current_status; } if($status === self::FAILURE) { if( $this->current_status === self::FAILURE ) { $this->consecutive_failures++; } else { $this->failure_time = time(); } } else { $this->consecutive_failures = 0; } $this->status_time = time(); $this->current_status = $status; $this->log_service_event(); } public function log_current_status() { foreach($this->loggers as $logger) { $logger->log_current_status($this); } } private function log_service_event() { foreach($this->loggers as $logger) { $logger->log_service_event($this); } } public function register_logger(ServiceLogger $logger) { $this->loggers[] = $logger; } } 上面的__call()重载方法提供对一个ServiceCheck对象的参数的只读存取操作: · timeout-在引擎终止检查之前,这一检查能够挂起多长时间。 · next_attempt-下次尝试连接到服务器的时间。 · current_status-服务的当前状态:SUCCESS或FAILURE。 · previous_status-当前状态之前的状态。 · frequency-每隔多长时间检查一次服务。 · description-服务描述。 · consecutive_failures-自从上次成功以来,服务检查连续失败的次数。 · status_time-服务被检查的最后时间。 · failure_time-如果状态为FAILED,则它代表发生失败的时间。 这个类还实现了观察者模式,允许ServiceLogger类型的对象注册自身,然后当调用log_current_status()或log_service_event()时调用它。 这里实现的关键函数是run(),它负责定义应该怎样执行检查。如果检查成功,它应该返回SUCCESS;否则返回FAILURE。 当定义在run()中的服务检查返回后,post_run()方法被调用。它负责设置对象的状态并实现记入日志。 ServiceLogger接口:指定一个日志类仅需要实现两个方法:log_service_event()和log_current_status(),它们分别在当一个run()检查返回时和当实现一个普通状态请求时被调用。 该接口如下所示: interface ServiceLogger { 最后,你需要编写引擎本身。该想法类似于在前一节编写简单程序时使用的思想:服务器应该创建一个新的进程来处理每一次检查并使用一个SIGCHLD处理器来检测当检查完成时的返回值。可以同时检查的最大数目应该是可配置的,从而可以防止对系统资源的过渡使用。所有的服务和日志都将在一个XML文件中定义。 下面是 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |