一旦用户在其服务器上安装了 php 应用程序,我想动态添加 cron 作业,例如管理员配置,我需要动态设置 cron 作业,一旦想到它在 php 中的配置设置? 我正在使用编码点火器来设置 cron 作业,我也手动从 cpanel 添加了相同的内容,它工作正常。
您可以在 中创建文件
/etc/cron.d
并使用 PHP 的file_put_contents()
来更新文件。但是,您需要提升 PHP 或 Apache 的权限(取决于您的 PHP 处理程序(。不建议这样做,因为它会导致安全问题。
如果您使用 Cron 运行 PHP 脚本,那么您可以每隔 X 次直接使用 PHP 调用脚本。在数据库中创建一个变量,表示上次运行脚本的时间。如果自运行脚本以来已经过去了 X 时间,则运行脚本并更新变量。 如果脚本需要很长时间才能执行,请使用 PHP 在单独的进程中运行它,这样用户就不必等待它完成。
谢谢
首先,您必须创建一个 txt 文件,例如 crontab.txt 然后你必须使用如下所示的外壳脚本
exec ( 'sudo crontab -u apache -r' );
file_put_contents ( '/var/www/html/YOUR_PROJECT/crontab.txt',"25 15 * * * php /var/www/html/YOUR_PROJECT/YOUR_CONTROLLER/YOUR_METHOD'.PHP_EOL);
最后,您必须像
exec ( 'crontab /var/www/html/YOUR_PROJECT/crontab.txt' );
希望这对您有所帮助。
您可以使用shell脚本执行此操作
shell_exec('echo "25 15 * * * <path to php> /var/www/cronjob/helloworld.php > /var/www/cronjob/cron.log" | crontab -')
您可以使用这些函数或类
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("rn", trim($jobs)); // trim() gets rid of the last rn
foreach ($array as $key => $item) {
if ($item == '') {
unset($array[$key]);
}
}
return $array;
}
static private function arrayToString($jobs = array()) {
$string = implode("rn", $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;
}
}
}
感谢您的回复,我现在根据回复得到了答案 我尝试使用 php(代码点火器(将一个新的 cronjob 添加到 crontab 文件中: 以下是我的回答
$phppath = exec('which php');
$user_file_path = getcwd();
$cronjob1 = "0 0 1 * * $phppath $user_file_path/index.php
automatic_updates/leave_update_cron";
// run each cron job
// get all current cron jobs
$output = shell_exec('crontab -l');
// add our new job
file_put_contents('/tmp/crontab.txt', $output.$cronjob1.PHP_EOL);
// once append the job, execute the new file
exec('crontab /tmp/crontab.txt');
这将添加新的 cronjob,而不会删除当前 cronjob 文件上的任何内容