laravel 队列 - 同步驱动程序如何工作?它是在单独的进程/线程还是主执行线程中执行?

Posted

技术标签:

【中文标题】laravel 队列 - 同步驱动程序如何工作?它是在单独的进程/线程还是主执行线程中执行?【英文标题】:laravel queues - how sync driver works? Does it executes in a separate process/thread or the main execution thread? 【发布时间】:2017-09-14 00:39:36 【问题描述】:

我正在从我的服务器发送推送通知,并希望它在后台进程中简单地执行。我已经阅读了 Laravel 文档,并且还了解数据库驱动程序和其他一些选项。我已经让它在我的本地机器上与数据库驱动程序一起工作,但有一件事困扰着我,我必须启动一个后台线程来监听使用php artisan queue:listen --deamon 添加到队列中的作业。

关键是,它总是通过像“crone”任务一样运行来消耗我的一些资源和内存。我只想在触发推送通知时创建一个新进程,它应该在添加后立即开始执行,之后应该关闭该进程。另一方面,对于 laravel 作业,我总是必须运行一个我想避免的后台进程,而且我使用的是共享主机,它不允许我在我的服务器上安装“主管”来监控我的作业执行。

任何人都可以消除这种歧义吗?处理这种情况的更好方法是什么?

【问题讨论】:

同步驱动程序在主执行线程而不是后台工作线程上执行进程。这对调试很有用 @SanderVisser 那么更好的方法是什么? 可以使用数据库驱动,但是需要后台进程运行。或者您可以使用同步驱动程序,但该驱动程序在主线程上执行。在 PHP 世界中,很难从主线程生成一个后台进程,并且会带来很多问题。但是,如果您真的愿意,您可以创建自己的驱动程序来生成后台任务。 【参考方案1】:

队列同步现在与 http 请求或线程在同一线程中运行。守护进程没有运行,我将在本地测试中使用同步队列,你使用 dd(),将所有数据显示到屏幕

【讨论】:

【参考方案2】:

经过一番研究,我决定使用database 驱动程序。还有一些其他不错的选择,但选择将取决于您的系统工作负载。

重点是,sync 驱动程序使用主线程来执行任务,这仅在您处于开发阶段时才有用。如果您有一个生产系统,那么您可能需要考虑一些其他选项来运行您的队列。排队长时间运行的任务的主要思想是能够在某个后台进程中执行它们,这样您的主应用程序线程就不会阻塞,您可以更快地处理您的客户端请求。

有关不同驱动程序的更多信息和帮助,请访问Laravel docs

【讨论】:

如果您要在生产环境中运行应用程序,请不要使用数据库,最好使用 beanstalkd 或类似的东西,因为数据库在涉及到时不完全是写/读安全的快速写/读 @JanVansteenlandt 您对生产环境的看法是正确的,但这是针对初学者应用程序。 Redis 是最好的选择之一,而不是数据库。 可以,但这取决于您的应用要求。

以上是关于laravel 队列 - 同步驱动程序如何工作?它是在单独的进程/线程还是主执行线程中执行?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:队列:听PDOException:找不到驱动程序

Laravel Scheduler作业触发失败事件,即使它没有失败

Laravel 队列应用

Laravel 队列:在主机中永远运行的工作?

使用 Supervisor 运行多个 Laravel 队列工作者

Laravel如何停止/重新启动特定队列的工作人员?