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

时间:2019-07-18 13:31:01

标签: laravel curl service-provider

具体来说,我正在执行的操作是在AppServiceProvider-> boot()方法中,如下所示创建单例类:

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

我用于将通知推送到移动应用程序的Queue worker作业需要helper类。当移动设备是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封通知。每当我使用连接时,我都会检查错误,并在需要时关闭/重新打开连接,例如:

 curl_close($http2Connection);

但是,我想知道如何检测应用程序何时永久关闭,以便可以正常关闭连接。如果无法执行此操作,那么随着时间的推移,如果断开开放的连接,它将对我的服务器造成伤害,如果该应用每天要启动/停止几次,可以说要运行几个月?

另一个选项可能是curl选项,以告知连接在这么长的时间后自动断开连接。 (我强制关闭并每隔4个小时重新打开一次),因此,如果我至少可以告诉连接在5个小时后自动关闭,那是否会自我清洁?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您可以使用boot方法执行任何操作。 来自laravel docs

在所有其他服务提供商都被使用之后调用此方法 已注册,这意味着您可以访问具有以下功能的所有其他服务 已由框架注册

关键是启动方法在所有服务都注册后运行,因此,您可以在启动方法定义中注入服务。

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

我认为,您必须在所有情况下使用此方法来运行应用程序所需的代码:用户登录,用户注销,发布,获取,放置等,等等。