我正在尝试查看是否有一种方法可以在不使用
exec()
或 shell_exec()
功能的情况下编辑 cron 作业。出于安全原因,我的主机已禁用这些功能。我已经阅读了 Stack Overflow 内外更新 crontab 项目的方法(例如,在 how to edit crontab with PHP shell_exec 和 how to edit crontab with PHP shell_exec),但我找到的所有解决方案都需要我使用 shell_exec()
或 exec()
功能,我做不到。有没有一种方法可以在不使用这些功能的情况下更新 cron 作业?
注意:我不一定需要添加或删除项目,只需更新它们的频率即可。 (但我想如果我可以更新,我就可以添加和删除。)
我建议使用单个文件来管理您的所有 cron 需求。您将每分钟调用此文件
* * * * *
,但该文件将做的主要事情是利用包dragonmantank/cron-expression
来决定是否以及何时执行脚本,在代码中。非常灵活且易于管理。
使用composer安装https://packagist.org/packages/dragonmantank/cron-expression
创建一个 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);
}
}