使用 PHP 创建、编辑和删除 crontab 作业?

是否可以使用 PHP 来创建、编辑和删除 crontab 作业?

我知道如何列出 Apache 用户当前的 crontab 作业:

$output = shell_exec('crontab -l');
echo $output;

但是如何用 PHP 添加 cron 作业呢?“ crontab-e”将只打开一个文本编辑器,您将不得不在保存文件之前手动编辑条目。

如何使用 PHP 删除 cron 作业? 同样,您必须通过“ crontab-e”手动完成。

像这样的工作字符串:

$job = '0 */2 * * * /usr/bin/php5 /home/user1/work.php';

如何使用 PHP 将其添加到 crontab 作业列表中?

148001 次浏览

最简单的方法是使用 shell _ exec 命令执行 bash 脚本,并将值作为参数传入。从那里,您可以操作 crontab,就像在任何其他非交互式脚本中一样,还可以通过使用 sudo 等来确保您拥有正确的权限。

看这个 没有 Crontab-e 的 Crontab了解更多信息。

你可以尝试用类似于 ed的软件来覆盖 EDITOR环境变量,它可以在标准输入上执行一系列编辑命令。

取决于您将 crontab 存储在哪里:

shell_exec('echo "'. $job .'" >> crontab');

取代 crontab,你也可以使用谷歌的应用程序引擎 任务队列。它有一个慷慨的免费配额,是快速的,可扩展的,可修改的。

Crontab 命令用法

usage:  crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e      (edit user's crontab)
-l      (list user's crontab)
-r      (delete user's crontab)
-i      (prompt before deleting user's crontab)

那么,

$output = shell_exec('crontab -l');
file_put_contents('/tmp/crontab.txt', $output.'* * * * * NEW_CRON'.PHP_EOL);
echo exec('crontab /tmp/crontab.txt');

The above can be used for both 创建和编辑/附加 provided the user has the adequate file write permission.

删除作业:

echo exec('crontab -r');

另外,请注意,apache 是作为特定用户运行的,而且通常不是 root 用户,这意味着 cron 作业只能为 apache 用户更改,除非给予 apache 用户 crontab -u特权。

您可以将文件格式设置为/etc/cron.d/in cron 格式 要列出特定于脚本的 cron 作业,只需使用具有唯一前缀的文件列表。 要禁用作业时,请删除该文件。

We recently prepared a mini project (PHP>=5.3) to manage the cron files for private and individual tasks. This tool connects and manages the cron files so you can use them, for example per project. Unit Tests available :-)

来自命令行的示例:

bin/cronman --enable /var/www/myproject/.cronfile --user www-data

空气污染指数样本:

use php\manager\crontab\CrontabManager;


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

管理 API 中的个别任务:

use php\manager\crontab\CrontabManager;


$crontab = new CrontabManager();
$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-crontab-manager

This should do it

shell_exec("crontab -l | { cat; echo '*/1    *    *    *    *    command'; } |crontab -");

不错..。
尝试删除特定的 cron 作业(测试)

<?php $output = shell_exec('crontab -l'); ?>
<?php $cron_file = "/tmp/crontab.txt"; ?>


<!-- Execute script when form is submitted -->
<?php if(isset($_POST['add_cron'])) { ?>


<!-- Add new cron job -->
<?php if(!empty($_POST['add_cron'])) { ?>
<?php file_put_contents($cron_file, $output.$_POST['add_cron'].PHP_EOL); ?>
<?php } ?>


<!-- Remove cron job -->
<?php if(!empty($_POST['remove_cron'])) { ?>
<?php $remove_cron = str_replace($_POST['remove_cron']."\n", "", $output); ?>
<?php file_put_contents($cron_file, $remove_cron.PHP_EOL); ?>
<?php } ?>


<!-- Remove all cron jobs -->
<?php if(isset($_POST['remove_all_cron'])) { ?>
<?php echo exec("crontab -r"); ?>
<?php } else { ?>
<?php echo exec("crontab $cron_file"); ?>
<?php } ?>


<!-- Reload page to get updated cron jobs -->
<?php $uri = $_SERVER['REQUEST_URI']; ?>
<?php header("Location: $uri"); ?>
<?php exit; ?>
<?php } ?>


<b>Current Cron Jobs:</b><br>
<?php echo nl2br($output); ?>


<h2>Add or Remove Cron Job</h2>
<form method="post" action="<?php $_SERVER['REQUEST_URI']; ?>">
<b>Add New Cron Job:</b><br>
<input type="text" name="add_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<b>Remove Cron Job:</b><br>
<input type="text" name="remove_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<input type="checkbox" name="remove_all_cron" value="1"> Remove all cron jobs?<br>
<input type="submit"><br>
</form>

检查一下

function cronjob_exists($command){


$cronjob_exists=false;


exec('crontab -l', $crontab);




if(isset($crontab)&&is_array($crontab)){


$crontab = array_flip($crontab);


if(isset($crontab[$command])){


$cronjob_exists=true;


}


}
return $cronjob_exists;
}

附加一个骗子

function append_cronjob($command){


if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){


//add job to crontab
exec('echo -e "`crontab -l`\n'.$command.'" | crontab -', $output);




}


return $output;
}

删除 crontab

exec('crontab -r', $crontab);

例子

exec('crontab -r', $crontab);


append_cronjob('* * * * * curl -s http://localhost/cron/test1.php');


append_cronjob('* * * * * curl -s http://localhost/cron/test2.php');


append_cronjob('* * * * * curl -s http://localhost/cron/test3.php');

我尝试了下面的解决方案

class Crontab {


// In this class, array instead of string would be the standard input / output format.


// Legacy way to add a job:
// $output = shell_exec('(crontab -l; echo "'.$job.'") | crontab -');


static private function stringToArray($jobs = '') {
$array = explode("\r\n", trim($jobs)); // trim() gets rid of the last \r\n
foreach ($array as $key => $item) {
if ($item == '') {
unset($array[$key]);
}
}
return $array;
}


static private function arrayToString($jobs = array()) {
$string = implode("\r\n", $jobs);
return $string;
}


static public function getJobs() {
$output = shell_exec('crontab -l');
return self::stringToArray($output);
}


static public function saveJobs($jobs = array()) {
$output = shell_exec('echo "'.self::arrayToString($jobs).'" | crontab -');
return $output;
}


static public function doesJobExist($job = '') {
$jobs = self::getJobs();
if (in_array($job, $jobs)) {
return true;
} else {
return false;
}
}


static public function addJob($job = '') {
if (self::doesJobExist($job)) {
return false;
} else {
$jobs = self::getJobs();
$jobs[] = $job;
return self::saveJobs($jobs);
}
}


static public function removeJob($job = '') {
if (self::doesJobExist($job)) {
$jobs = self::getJobs();
unset($jobs[array_search($job, $jobs)]);
return self::saveJobs($jobs);
} else {
return false;
}
}

}

credits to : Crontab Class to Add, Edit and Remove Cron Jobs

很简单,你可以通过 curl 来做到这一点,确保 curl 安装在服务器上:

每一分钟都会触发: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

        • *

    每分钟每小时每月每周

假设你想每天下午2:15发送这个通知 您可以根据您的 API 更改 POST/GET:

1514 * * * curl —— request POST‘ url of ur API’