mutex = $mutex; $this->callback = $callback; $this->parameters = $parameters; } /** * Run the given event. * * @param \Illuminate\Contracts\Container\Container $container * @return mixed * * @throws \Exception */ public function run(Container $container) { if ($this->description && $this->withoutOverlapping && ! $this->mutex->create($this)) { return; } $pid = getmypid(); register_shutdown_function(function () use ($pid) { if ($pid === getmypid()) { $this->removeMutex(); } }); parent::callBeforeCallbacks($container); try { $response = $container->call($this->callback, $this->parameters); } finally { $this->removeMutex(); parent::callAfterCallbacks($container); } return $response; } /** * Clear the mutex for the event. * * @return void */ protected function removeMutex() { if ($this->description) { $this->mutex->forget($this); } } /** * Do not allow the event to overlap each other. * * @param int $expiresAt * @return $this * * @throws \LogicException */ public function withoutOverlapping($expiresAt = 1440) { if (! isset($this->description)) { throw new LogicException( "A scheduled event name is required to prevent overlapping. Use the 'name' method before 'withoutOverlapping'." ); } $this->withoutOverlapping = true; $this->expiresAt = $expiresAt; return $this->skip(function () { return $this->mutex->exists($this); }); } /** * Allow the event to only run on one server for each cron expression. * * @return $this * * @throws \LogicException */ public function onOneServer() { if (! isset($this->description)) { throw new LogicException( "A scheduled event name is required to only run on one server. Use the 'name' method before 'onOneServer'." ); } $this->onOneServer = true; return $this; } /** * Get the mutex name for the scheduled command. * * @return string */ public function mutexName() { return 'framework/schedule-'.sha1($this->description); } /** * Get the summary of the event for display. * * @return string */ public function getSummaryForDisplay() { if (is_string($this->description)) { return $this->description; } return is_string($this->callback) ? $this->callback : 'Closure'; } }