新客网
首页 | 新闻 | 系统·网络·服务器·安全 | 工具·办公 | 编程·数据库 | 图象·网页·运营 | 硬件·存储 | 专题教程 | 论坛·old
 → 当前位置:首页 > 教程 > 编程开发 > PHP教程 > 正文

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

XKER.COM   2006-10-27 10:59:43  来源:天极开发  点击:

  摘要在本文中,让我们共同探讨基于PHP语言构建一个基本的服务器端监视引擎的诸多技巧及注意事项,并给出完整的源码实现。

  一. 更改工作目录的问题

  当你编写一个监视程序时,让它设置自己的工作目录通常更好些。这样以来,如果你使用一个相对路径读写文件,那么,它会根据情况自动处理用户期望存放文件的位置。总是限制程序中使用的路径尽管是一种良好的实践;但是,却失去了应有的灵活性。因此,改变你的工作目录的最安全的方法是,既使用chdir()也使用chroot()。

  chroot()可用于PHP的CLI和CGI版本中,但是却要求程序以根权限运行。chroot()实际上把当前进程的路径从根目录改变到指定的目录。这使得当前进程只能执行存在于该目录下的文件。经常情况下,chroot()由服务器作为一个"安全设备"使用以确保恶意代码不会修改一个特定的目录之外的文件。请牢记,尽管chroot()能够阻止你访问你的新目录之外的任何文件,但是,任何当前打开的文件资源仍然能够被存取。例如,下列代码能够打开一个日志文件,调用chroot()并切换到一个数据目录;然后,仍然能够成功地登录并进而打开文件资源:

<?php
$logfile = fopen("/var/log/chroot.log", "w");
chroot("/Users/george");
fputs($logfile, "Hello From Inside The Chroot\n");
?>

  如果一个应用程序不能使用chroot(),那么你可以调用chdir()来设置工作目录。例如,当代码需要加载特定的代码(这些代码能够在系统的任何地方被定位时),这是很有用的。注意,chdir()没有提供安全机制来防止打开未授权的文件。

  二. 放弃特权

  当编写Unix守护程序时,一种经典的安全预防措施是让它们放弃所有不需要的特权;否则,拥有不需要的特权容易招致不必要的麻烦。在代码(或PHP本身)中含有漏洞的情况下,通过确保一个守护程序以最小权限用户身份运行,往往能够使损失减到最小。

  一种实现此目的的方法是,以非特权用户身份执行该守护程序。然而,如果程序需要在一开始就打开非特权用户无权打开的资源(例如日志文件,数据文件,套接字,等等)的话,这通常是不够的。www.xker.com()


  如果你以根用户身份运行,那么你能够借助于posix_setuid()和posiz_setgid()函数来放弃你的特权。下面的示例把当前运行程序的特权改变为用户nobody所拥有的那些权限:

$pw=posix_getpwnam('nobody');
posix_setuid($pw['uid']);
posix_setgid($pw['gid']);

  就象chroot()一样,任何在放弃特权之前被打开的特权资源都会保持为打开,但是不能创建新的资源。

  三. 保证排它性

  你可能经常想实现:一个脚本在任何时刻仅运行一个实例。为了保护脚本,这是特别重要的,因为在后台运行容易导致偶然情况下调用多个实例。

  保证这种排它性的标准技术是,通过使用flock()来让脚本锁定一个特定的文件(经常是一个加锁文件,并且被排它式使用)。如果锁定失败,该脚本应该输出一个错误并退出。下面是一个示例:

$fp=fopen("/tmp/.lockfile","a");
if(!$fp || !flock($fp, LOCK_EX | LOCK_NB)) {
 fputs(STDERR, "Failed to acquire lock\n");
 exit;
}
/*成功锁定以安全地执行工作*/


  注意,有关锁机制的讨论涉及较多内容,在此不多加解释。

 四. 构建监视服务

  在这一节中,我们将使用PHP来编写一个基本的监视引擎。因为你不会事先知道怎样改变,所以你应该使它的实现既灵活又具可能性。
该记录程序应该能够支持任意的服务检查(例如,HTTP和FTP服务)并且能够以任意方式(通过电子邮件,输出到一个日志文件,等等)记录事件。你当然想让它以一个守护程序方式运行;所以,你应该请求它输出其完整的当前状态。

  一个服务需要实现下列抽象类:

abstract class ServiceCheck {
 const FAILURE = 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;
 }
}

本新闻共4页,当前在第1页  1  2  3  4  

上一篇教程:php高手进阶:写一个用户在线显示的程序
下一篇教程:多个字段,大量记录的插入操作技巧(PHP)
收藏本文】 【我要投稿】 【打印本文】 【论坛讨论】 【关闭窗口

相关文章
·电子邮局PHP应用篇——POP3邮件的收取(二)·电子邮局PHP应用篇——POP3邮件的收取(一) 
·PHP的应用——聊天室开发完全手册(三)·PHP的应用——聊天室开发完全手册(二) 
·PHP的应用——聊天室开发完全手册(一)·LINUX环境中用PHP构建网站:用递归函数写论坛
·LINUX环境中用PHP构建网站:用户的登入认证·LINUX环境中用PHP够建网站:新闻发布系统
·LINUX环境中用PHP构建网站:搜索引擎的实现·用 Oracle AS 10g 为PHP提供的一次性登录
·PHP中英文混合排版中处理字符串常用的函数·多个字段,大量记录的插入操作技巧(PHP)
·php高手进阶:写一个用户在线显示的程序·在PHP开发过程中实现验证码一法
·在PHP中实现文件的上传功能·Linux下用PHP4连接ORACLE8I的方法

学院文章搜索
  
推荐文章
·嵌入式Linux操作系统启动信
·网页设计配色应用实例剖析
·如何安全安装Vista系统
·Photoshop巧绘制非洲菊
·简简单单用软件给MP3掐头去
·ASP初学者常用源代码总结篇
·利用异常表处理Linux内核态
·Linux命令行下如何配置nVI
·如何实现Linux与windows的
·秘籍:右键菜单终极锤炼术
阅读排行
·免费代理IP(每日更新)
·流氓网站招招看 详细剖析恶
·轻松恢复硬盘数据 EasyRec
·DOS下对系统重新进行分区
·清除猖狂的Sxs.exe病毒
·DOS常用命令
·编程过把瘾:自己动手写操
·windows下如何修改右键菜单
·DOS下常用的相关网络命令
·SQL Server安装文件挂起错
专题教程
·MySQL 专题
·数据恢复指南 专题
·Web服务器专题
·DB2 9数据库专题
·ghost教程 专题
·局域网技术专题
·虚拟机专题
·CDN加速技术专题
·注册表教程专题
·电脑技巧 专题
最新文章
·电子邮局PHP应用篇——POP
·电子邮局PHP应用篇——POP
·PHP的应用——聊天室开发完
·PHP的应用——聊天室开发完
·PHP的应用——聊天室开发完
·LINUX环境中用PHP构建网站
·LINUX环境中用PHP构建网站
·LINUX环境中用PHP够建网站
·LINUX环境中用PHP构建网站
·用 Oracle AS 10g 为PHP提
设为首页 - 加入收藏 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2003 - 2006 XKER Inc. All Rights Reserved
新客网 版权所有