Show a message about setting up the cron and if there was an error running it (#425)
This commit is contained in:
@@ -6,11 +6,22 @@ use App\Console\Cron\Hourly;
|
|||||||
use App\Console\Cron\Monthly;
|
use App\Console\Cron\Monthly;
|
||||||
use App\Console\Cron\Nightly;
|
use App\Console\Cron\Nightly;
|
||||||
use App\Console\Cron\Weekly;
|
use App\Console\Cron\Weekly;
|
||||||
|
use App\Services\CronService;
|
||||||
use Illuminate\Console\Scheduling\Schedule;
|
use Illuminate\Console\Scheduling\Schedule;
|
||||||
|
use Illuminate\Contracts\Events\Dispatcher;
|
||||||
|
use Illuminate\Contracts\Foundation\Application;
|
||||||
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
||||||
|
|
||||||
class Kernel extends ConsoleKernel
|
class Kernel extends ConsoleKernel
|
||||||
{
|
{
|
||||||
|
private $cronSvc;
|
||||||
|
|
||||||
|
public function __construct(Application $app, Dispatcher $events)
|
||||||
|
{
|
||||||
|
parent::__construct($app, $events);
|
||||||
|
$this->cronSvc = app(CronService::class);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define the application's command schedule.
|
* Define the application's command schedule.
|
||||||
*
|
*
|
||||||
@@ -28,6 +39,9 @@ class Kernel extends ConsoleKernel
|
|||||||
// When spatie-backups runs
|
// When spatie-backups runs
|
||||||
$schedule->command('backup:clean')->daily()->at('01:00');
|
$schedule->command('backup:clean')->daily()->at('01:00');
|
||||||
$schedule->command('backup:run')->daily()->at('02:00');
|
$schedule->command('backup:run')->daily()->at('02:00');
|
||||||
|
|
||||||
|
// Update the last time the cron was run
|
||||||
|
$this->cronSvc->updateLastRunTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,19 +3,33 @@
|
|||||||
namespace App\Http\Controllers\Admin;
|
namespace App\Http\Controllers\Admin;
|
||||||
|
|
||||||
use App\Contracts\Controller;
|
use App\Contracts\Controller;
|
||||||
|
use App\Services\CronService;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Artisan;
|
use Illuminate\Support\Facades\Artisan;
|
||||||
use Laracasts\Flash\Flash;
|
use Laracasts\Flash\Flash;
|
||||||
|
|
||||||
class MaintenanceController extends Controller
|
class MaintenanceController extends Controller
|
||||||
{
|
{
|
||||||
public function __construct()
|
private $cronSvc;
|
||||||
|
|
||||||
|
public function __construct(CronService $cronSvc)
|
||||||
{
|
{
|
||||||
|
$this->cronSvc = $cronSvc;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
return view('admin.maintenance.index');
|
// Generate the cron path. Replace php-fpm with just php
|
||||||
|
$cron_path = [
|
||||||
|
'* * * * *',
|
||||||
|
$this->cronSvc->getCronPath(),
|
||||||
|
'>> /dev/null 2>&1',
|
||||||
|
];
|
||||||
|
|
||||||
|
return view('admin.maintenance.index', [
|
||||||
|
'cron_path' => implode(' ', $cron_path),
|
||||||
|
'cron_problem_exists' => $this->cronSvc->cronProblemExists(),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
73
app/Services/CronService.php
Normal file
73
app/Services/CronService.php
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Services;
|
||||||
|
|
||||||
|
use App\Contracts\Service;
|
||||||
|
use App\Repositories\KvpRepository;
|
||||||
|
use DateTime;
|
||||||
|
use DateTimeZone;
|
||||||
|
use Exception;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
|
class CronService extends Service
|
||||||
|
{
|
||||||
|
private $kvpRepo;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
KvpRepository $kvpRepo
|
||||||
|
) {
|
||||||
|
$this->kvpRepo = $kvpRepo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path for running a cron job
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCronPath(): string
|
||||||
|
{
|
||||||
|
$path = [
|
||||||
|
'cd '.base_path(),
|
||||||
|
'&&',
|
||||||
|
str_replace('-fpm', '', PHP_BINARY),
|
||||||
|
'artisan schedule:run',
|
||||||
|
];
|
||||||
|
|
||||||
|
return implode(' ', $path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the last time the cron was run in the kvp repo
|
||||||
|
*/
|
||||||
|
public function updateLastRunTime()
|
||||||
|
{
|
||||||
|
$dt = new DateTime('now', DateTimeZone::UTC);
|
||||||
|
$this->kvpRepo->save('cron_last_run', $dt->format(DateTime::ISO8601));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* True/false if there's a problem with the cron. Now this is mainly
|
||||||
|
* if the cron hasn't run in the last 5 minutes at least
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function cronProblemExists(): bool
|
||||||
|
{
|
||||||
|
$last_run = $this->kvpRepo->get('cron_last_run');
|
||||||
|
if (empty($last_run)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$dt = DateTime::createFromFormat(DateTime::ISO8601, $last_run);
|
||||||
|
$dt_now = new DateTime('now', DateTimeZone::UTC);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
Log::error('Error checking for cron problem: '.$e->getMessage());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// More than 5 minutes... there's a problem
|
||||||
|
$diff = $dt_now->diff($dt);
|
||||||
|
return $diff->i > 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
<h6><i class="fas fa-clock"></i>
|
<h6><i class="fas fa-clock"></i>
|
||||||
Reset Caches
|
Reset Caches
|
||||||
</h6>
|
</h6>
|
||||||
<div class="row">
|
<div class="row" style="padding-top: 5px">
|
||||||
<div class="col-sm-4 text-center">
|
<div class="col-sm-4 text-center">
|
||||||
{{ Form::open(['route' => 'admin.maintenance.cache']) }}
|
{{ Form::open(['route' => 'admin.maintenance.cache']) }}
|
||||||
{{ Form::hidden('type', 'all') }}
|
{{ Form::hidden('type', 'all') }}
|
||||||
|
|||||||
24
resources/views/admin/maintenance/cron.blade.php
Normal file
24
resources/views/admin/maintenance/cron.blade.php
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="form-container">
|
||||||
|
<h6><i class="fas fa-clock"></i>
|
||||||
|
Cron
|
||||||
|
</h6>
|
||||||
|
<div class="row" style="padding-top: 5px">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<p>A cron must be created that runs every minute calling artisan. Example:</p>
|
||||||
|
<label style="width: 100%">
|
||||||
|
<input type="text" value="{{ $cron_path }}" class="form-control" style="width: 100%"/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
@if($cron_problem_exists)
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
There was a problem running the cron; make sure it's setup and check logs at
|
||||||
|
<span class="text-monospace bg-gradient-dark">storage/logs/cron.log</span>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -4,6 +4,12 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
@include('flash::message')
|
@include('flash::message')
|
||||||
|
|
||||||
|
<div class="card border-blue-bottom">
|
||||||
|
<div class="content">
|
||||||
|
@include('admin.maintenance.cron')
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="card border-blue-bottom">
|
<div class="card border-blue-bottom">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
@include('admin.maintenance.caches')
|
@include('admin.maintenance.caches')
|
||||||
|
|||||||
Reference in New Issue
Block a user