编辑 crontab 而不使用 exec()、shell_exec() 等

问题描述 投票:0回答:1

我正在尝试查看是否有一种方法可以在不使用

exec()
shell_exec()
功能的情况下编辑 cron 作业。出于安全原因,我的主机已禁用这些功能。我已经阅读了 Stack Overflow 内外更新 crontab 项目的方法(例如,在 how to edit crontab with PHP shell_exechow to edit crontab with PHP shell_exec),但我找到的所有解决方案都需要我使用
shell_exec()
exec()
功能,我做不到。有没有一种方法可以在不使用这些功能的情况下更新 cron 作业?

注意:我不一定需要添加或删除项目,只需更新它们的频率即可。 (但我想如果我可以更新,我就可以添加和删除。)

php cron
1个回答
0
投票

我建议使用单个文件来管理您的所有 cron 需求。您将每分钟调用此文件

* * * * *
,但该文件将做的主要事情是利用包
dragonmantank/cron-expression
来决定是否以及何时执行脚本,在代码中。非常灵活且易于管理。

  1. 使用composer安装https://packagist.org/packages/dragonmantank/cron-expression

  2. 创建一个 cron 作业,

    * * * * * /use/bin/php /path/to/your/tick.php

tick.php:


// every hour
$schedule = "20 * * * *";
$job = '/path/to/job.php';

// main logic, decide if to run job
$cron = Cron\CronExpression::factory($schedule);
if ($cron->isDue()) {
    require ($job);
}

当然现在你可以准备一个包含任意数量作业的数组:

$arr_jobs = [
    [
        'schedule' => '0 0 * * *',
        'script' => 'job1.php',
    ],
    [
        'schedule' => '0 12 * * 5',
        'script' => 'job2.php',
    ],
];

更新了tick.php:

foreach ($arr_jobs as $job) {
    $schedule = $job['schedule'];
    $job = $job['script'];

    // main logic, decide if to run job
    $cron = Cron\CronExpression::factory($schedule);
    if ($cron->isDue()) {
        require ($job);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.