php5.3下使用php管理crontab计划任务

1.使用php-crontab-manager管理计划任务
要求 PHP>=5.3

使用方法举例

 代码如下 复制代码

use phpmanagercrontabCrontabManager;

$crontab = new CrontabManager();
$crontab->enableOrUpdate('/tmp/my/crontab.txt');
$crontab->save();

添加一个简单的计划任务:

 代码如下 复制代码

use phpmanagercrontabCrontabManager;

$crontab = new Ssh2_crontab_manager();
$job = $crontab->newJob();
$job->on('* * * * *');
$job->onMinute('20-30')->doJob("echo foo");
$crontab->add($job);
$job->onMinute('35-40')->doJob("echo bar");
$crontab->add($job);
$crontab->save();

类文件

 代码如下 复制代码

<?php

Class Ssh2_crontab_manager {

 private $connection;
 private $path;
 private $handle;
 private $cron_file;

 function __construct($host=NULL, $port=NULL, $username=NULL, $password=NULL)
 {  
  $path_length  = strrpos(__FILE__, "/");
  $this->path   = substr(__FILE__, 0, $path_length) . '/';  
  $this->handle  = 'crontab.txt';
  $this->cron_file = "{$this->path}{$this->handle}";
  
  try
  {
   if (is_null($host) || is_null($port) || is_null($username) || is_null($password)) throw new Exception("The host, port, username and password arguments must be specified!");
  
   $this->connection = @ssh2_connect($host, $port);   
   if ( ! $this->connection) throw new Exception("The SSH2 connection could not be established.");

   $authentication = @ssh2_auth_password($this->connection, $username, $password);
   if ( ! $authentication) throw new Exception("Could not authenticate '{$username}' using pasword: '{$password}'.");
  }
  catch (Exception $e)
  {
   $this->error_message($e->getMessage());
  }
 }

 public function exec()
 {
  $argument_count = func_num_args();

  try
  {
   if ( ! $argument_count) throw new Exception("There is nothing to exececute, no arguments specified.");

   $arguments = func_get_args();
   
   $command_string = ($argument_count > 1) ? implode(" && ", $arguments) : $arguments[0];
   
   $stream = @ssh2_exec($this->connection, $command_string);
   if ( ! $stream) throw new Exception("Unable to execute the specified commands: <br />{$command_string}");
  }
  catch (Exception $e)
  {
   $this->error_message($e->getMessage());
  }

  return $this;
 }

 public function write_to_file($path=NULL, $handle=NULL)
 {
  if ( ! $this->crontab_file_exists())
  {  
   $this->handle = (is_null($handle)) ? $this->handle : $handle;
   $this->path   = (is_null($path))   ? $this->path   : $path;   
   $this->cron_file = "{$this->path}{$this->handle}";
   
   $init_cron = "crontab -l > {$this->cron_file} && [ -f {$this->cron_file} ] || > {$this->cron_file}";
   
   $this->exec($init_cron);  
  }
 
  return $this; 
 }
 
 public function remove_file()
 {  
  if ($this->crontab_file_exists()) $this->exec("rm {$this->cron_file}");  
  return $this;
 }
 
 public function append_cronjob($cron_jobs=NULL)
 {
  if (is_null($cron_jobs)) $this->error_message("Nothing to append!  Please specify a cron job or an array of cron jobs.");
  
  $append_cronfile = "echo '";  
  
  $append_cronfile .= (is_array($cron_jobs)) ? implode("n", $cron_jobs) : $cron_jobs;
  
  $append_cronfile .= "'  >> {$this->cron_file}";
  
  $install_cron = "crontab {$this->cron_file}";

  $this->write_to_file()->exec($append_cronfile, $install_cron)->remove_file();
  
  return $this;  
 }
 
 public function remove_cronjob($cron_jobs=NULL)
 { 
  if (is_null($cron_jobs)) $this->error_message("Nothing to remove!  Please specify a cron job or an array of cron jobs.");
  
  $this->write_to_file();
 
  $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES);
  
  if (empty($cron_array))
  {
   $this->remove_file()->error_message("Nothing to remove!  The cronTab is already empty.");   
  }
  
  $original_count = count($cron_array);
  
  if (is_array($cron_jobs))
  {
   foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT);
  }
  else
  {
   $cron_array = preg_grep($cron_jobs, $cron_array, PREG_GREP_INVERT);
  }
  
  return ($original_count === count($cron_array)) ? $this->remove_file() : $this->remove_crontab()->append_cronjob($cron_array);
 }

 public function remove_crontab()
 {
  $this->remove_file()->exec("crontab -r");  
  return $this;
 }

 private function crontab_file_exists()
 {
  return file_exists($this->cron_file);
 }
 
 private function error_message($error)
 {
  die("<pre style='color:#EE2711'>ERROR: {$error}</pre>");
 }
 
}

项目地址
https://github.com/MediovskiTechnology/php-crontab-manager

2.Ssh2_crontab_manager 关于php管理计划任务的详细教程

具体内容参考:
http://net.tutsplus.com/tutorials/php/managing-cron-jobs-with-php-2/

参考资料:

http://stackoverflow.com/questions/4421020/use-php-to-create-edit-and-delete-crontab-jobs

 

时间: 2024-10-25 13:57:50

php5.3下使用php管理crontab计划任务的相关文章

探索Linux之—CRONTAB计划任务

探索Linux之-CRONTAB计划任务   作者:吴伟龙Prudence Woo QQ:286507175 Mail:happy-wuweilong@hotmail.com   cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Crond 是Linux系统内置服务,默认情况下会随系统自动启动,当然也可以通过如下方式管理和维护contab计划任务服务. /sbin/service crond start //启动服务 /sbin/service crond sto

虚拟化和云计算趋势下的IT管理

作者:Michael Tseng.周荣彪 毋庸置疑,虚拟化和云计算是当前软件行业里最炙手可热的两个概念.在Gartner列出的2010年CIO十大优先考虑技术中,云计算和虚拟化当仁不让地列居前两位.和虚拟化与云计算概念火热对应的是:VMWare的市值大幅攀升,微软,IBM等巨头竞相投入虚拟化市场,在硬件虚拟化.平台虚拟化.应用虚拟化等各个方面跑马圈地.在国外,亚马逊为首的云计算平台如日中天,包括网络游戏新贵公司的Zynga(拥有每月超过2.8亿活跃用户)都在使用亚马逊的平台:在国内,新浪等大公司

简述PHP4和PHP5版本下解析XML文档的操作方法

在PHP网站开发与建设过程中,时常会碰到需要对XML文档进行解析,PHP4版本自带了XML解析器(sax),PHP5版本增加了SimpleXML(基于dom)的XML扩展,对XML的解析更是非常方便,今天和大家分享下在不同环境下对XML文档进行解析的方法.XML文档 1234567891011121314151617181920 <?xml version="1.0" encoding="gbk"?> <LeapsoulXML>      

Windows Server 2008下利用Diskpart管理磁盘

Windows Server 2008的一个特性在于,操作系统的许多方面的功能都可以通过命令行方式进行管理.如果我们在一台带GUI界面的电脑上正好需要定义一个RAID阵列,通常是比较容易实现,在磁盘管理控制台程序重点击几下鼠标即可完成安装操作. 如果需要对多台机器进行同样的RAID操作,采用脚本的方式效率会更高一些.同样,如果我们正在进行Server Core的安装,那就没有其它选择,只能从命令提示符下管理自己的磁盘子系统.本文中,将介绍如何采用命令行方式实现上面提到的功能. 1.Diskpar

详解Oracle RAC 环境下的连接管理

这篇文章详细介绍了Oracle RAC环境下的连接管理,分别介绍了什么是 Connect Time Load Balancing.Runtime Connection Load Balancing.Connect Time Connection Failover 和 Runtime Connection Failover,以及里面所涉及到的 TAF.ONS.FCF.FAN.LBA 等诸多知识点.本文主要是针对 Oracle RAC 11gR2 环境下的连接管理,但同时也会对比说明一下 Oracl

PHP5.2下preg

  这篇文章主要介绍了PHP5.2下preg_replace函数的问题,需要的朋友可以参考下 preg_replace 使用的超过了php5.2默认允许的字节,也就是pcre.backtrack_limit和pcre.recursion_limit的大小的问题. Discuz!6.0.0正式版程序发布以来,大家都热火朝天的升级中,但是部分插件在6.0下出现了问题 比如http://www.discuz.net/viewthread.php?tid=559133这个银行插件 在php为5.2.0及

电源管理-用c#,管理电源计划的API

问题描述 用c#,管理电源计划的API 我现在在做一个项目,需要通过调用windows的API,根据一定条件自动更改电源计划,这其中会需要调用哪些API,具体内容可以在哪里找到,发链接就行. 进一步的话如何自己通过程序设置自定义的电源计划? 我用的是C# 解决方案 通过WMI来控制电源管理

广东横琴新区地税局打造“大数据下纳税遵从管理”

广东横琴自贸区自挂牌成立以来,登记注册企业已超20000家,其中已引进和在洽谈的世界500强企业52家,国内500强投资企业76家,各类企业总部858家."自贸区效应"带来了区域发展的提速增效,为横琴税收可持续增长奠定了坚实的经济基础. 随着今年5月营改增的全面实施,"互联网+税务"的深入推进,横琴地税人深深地认识到:打造创新驱动发展的税务信息和服务平台,加快创新资源集聚,推动税收体制创新驱动发展,既是促进辖区企业发展的重要途径,又是实现税收稳定.持续增长的必由之路

《DB2性能管理与实战》——2.4 多分区下的内存管理特性

2.4 多分区下的内存管理特性 DB2性能管理与实战在分区数据库环境中使用自调整内存功能时,有一些因素决定该功能是否能适当地调整系统. 对分区数据库启用自调整内存功能时,会将一个数据库分区指定为调整分区,所有内存调整决定都根据该数据库分区的内存和工作负载特征作出.在该分区中作出调整决策之后,会将内存调整纷纷到其他数据库分区,以确保所有数据库分区都维护类似的配置. 单调整分区模型假定,仅当所有数据库分区具有类似内存需求时,才会使用该功能.在确定顶是否对分区数据库启用自调整内存功能时,请使用下列准则