Laravel 应用程序关闭时会触发什么事件?

What event is fired when Laravel app is being shutdown?

具体来说,我正在做的是在我的 AppServiceProvider->boot() 方法中,我正在创建一个单例 class,如下所示:

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->app->singleton('App\Support\PushNotificationHelper', function ($app) {
            return new PushNotificationHelper();
        });  
     }
 }

我用于将通知推送到移动应用程序的队列工作者作业需要助手 class。当移动设备是 Apple 设备时,我需要建立 curl 连接并使连接在队列工作程序生命周期结束后仍然存在。这就是为什么我使用单例来保持连接,如:

class PushNotificationHelper {
    protected $http2Connection;
    protected $http2Expire ;

    public function getConnection($options) {
        $this->http2Connection = curl_init();
        curl_setopt_array($this->http2Connection, $options);
        return $this->http2Connection;
    }

Apple 声称如果我反复连接和断开连接,他们将发出拒绝服务 (DOS)。我的应用程序实际上每小时发送 1000 条通知。每当我使用连接时,我都会检查错误并在需要时 close/reopen 连接,例如:

 curl_close($http2Connection);

但是我想知道如何检测应用程序何时会永久关闭,以便我可以正常关闭连接。如果没有办法做到这一点,它会随着时间的推移让打开的连接挂起而损害我的服务器,假设应用程序每天 start/stop 几次 运行 几个月?

另一个选项可能是有一个 curl 选项告诉连接在这么长时间后自动断开连接。 (我强制关闭并每 4 小时重新打开一次)所以如果我能告诉连接至少在 5 小时后自动关闭,那么也许它会自动清理?

恕我直言,您可以尝试将 终止回调 添加到您的应用程序实例中,例如在 AppServiceProvider 中,即:

public function boot()
{
    $this->app->terminating(function () {
       // your terminating code here
    });
}

任何事情都可以使用引导方法。 来自 laravel docs:

This method is called after all other service providers have been registered, meaning you have access to all other services that have been registered by the framework

关键是boot方法运行当所有的服务都注册了,所以,你可以在boot方法定义中注入服务。

public function boot(SomeService $someService, OtherService $otherService)
{
    $someService->doSomething();
    $otherService->doSomething();
}

在我看来,您必须使用此方法来 运行 您的应用程序在所有上下文中所需的代码:用户登录、用户注销、post、get、put 等。等