具体来说,我正在执行的操作是在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个小时后自动关闭,那是否会自我清洁?
答案 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();
}
我认为,您必须在所有情况下使用此方法来运行应用程序所需的代码:用户登录,用户注销,发布,获取,放置等,等等。