【问题标题】:What event is fired when Laravel app is being shutdown?Laravel 应用程序关闭时会触发什么事件?
【发布时间】:2019-11-27 11:02:14
【问题描述】:

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

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

我用于将通知推送到移动应用程序的队列工作者作业需要辅助类。当移动设备是 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 小时后自动关闭,那么它可能会自动清洁?

【问题讨论】:

  • "当移动设备是 Apple 设备时,我需要建立一个 curl 连接并让连接在队列工作者工作的生命周期内持续存在。这就是为什么我使用单例来保持连接比如:“我认为这不会像你想象的那样起作用。 PHP 中的单例在脚本运行期间存在。它在后续执行中不存在 - 它会在下次运行工作进程时重新初始化。 PHP 在脚本结束时关闭打开的连接(cURL、SQL 等)。
  • PHP 会自动关闭 curl 连接这么简单吗?那很好啊。我说持久的原因是我说这是为了“队列工作者”工作。这是一个长期存在的过程。当服务器启动并运行直到崩溃或手动停止时,它会在 linux 服务器上使用 Supervisor 启动。
  • 是的,除非出现重大故障,例如分段错误或您执行kill -9,PHP 将自行清理。
  • 您可能想发布它,以便我将其标记为答案

标签: laravel curl service-provider


【解决方案1】:

您可以将引导方法用于任何事情。 来自laravel docs

在所有其他服务提供者都已完成后调用此方法 已注册,这意味着您可以访问所有其他具有 已被框架注册

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

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

在我看来,您必须使用此方法在所有上下文中运行您的应用所需的代码:用户登录、用户注销、发布、获取、放置等。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多