Laravel:运行队列:在 Windows Azure Web App 上连续监听

Posted

技术标签:

【中文标题】Laravel:运行队列:在 Windows Azure Web App 上连续监听【英文标题】:Laravel: Running queue:listen continuously on Windows Azure Web App 【发布时间】:2016-10-10 07:48:04 【问题描述】:

我觉得问这个问题有点傻,但我似乎无法在互联网上找到这个问题的答案。在搜索了几个小时后,我发现在 linux 服务器上,您使用 Supervisor 在您的网站上连续运行“php artisan queue:listen”(有或没有守护程序)来处理推送到队列的作业。这一切都很好,但是如果我想在 Windows Azure Web 应用程序上执行此操作怎么办?在搜索了我发现的解决方案后:

创建一个 chron 作业以每分钟(或每 X 分钟)运行一次“php artisan queue:listen”,我真的不喜欢这个解决方案,并且希望在网站获得更多流量时特别避免使用它; 添加一个连续运行“php artisan queue:listen”的WebJob(这里的问题是我不知道如何为WebJob编写脚本...);

我想请你们帮忙看看哪些是正确的解决方案,如果有更好的解决方案,如果 WebJob 是最好的解决方案,我该如何为此编写脚本?提前致谢。

【问题讨论】:

【参考方案1】:

简而言之,Supervisor 是 nohup(不挂断)的现代替代品,并添加了一些其他零碎的东西。简而言之,还有其他资源可以让任务在后台运行(守护进程),而我用于基于 Windows 的项目(很少 tbh)的解决方案是 Forever,我通过以下方式发现:https://***.com/a/18226392/5912664

C:\myprojectroot > forever -c php artisan queue:listen --queue=some_nice_queue --tries=3

怎么做?

为 Windows 安装 node,然后使用 npm 安装 Forever

C:\myprojectroot > npm install -g forever

如果您无法在 Windows 上运行 Node,我建议您使用 Windows 包管理器,Chocolatey

https://chocolatey.org/packages?q=node

请务必检查 Forever 创建的任何日志文件,因为我留下的日志文件足够长,可以占用 30Gb 的磁盘空间!

【讨论】:

谢谢!我认为这可能会解决问题。如果不是要求太多,你能告诉我如何编写永远运行的 php 脚本吗?因为我需要调用命令“php artisan queue:listen”,而我不知道如何从 laravel 之外的 php 文件中调用它。 我假设您可以访问 CMD 或 PS shell?这个命令是从命令行运行的,你不必编写 PHP 脚本,因为 artisan 文件默认包含在 Laravel 中。如果您需要 PHP 脚本来执行/启动此方法,请查看 php.net/function.shell_exec 这看起来很有希望,但可惜......它不适用于 IIS 7.5。 @suncoastkid ,它不需要 IIS 来运行,永远是它自己的任务运行器。只需让您的后台脚本永远保持活力,并通过 IIS 为您提供基于 Web 的内容。适用于我编写的许多基于 Laravel 的应用程序! :) 我已经使用了这个命令“forever -c php artisan queue:listen redis”,现在cmd不断弹出并消失。怎么能阻止呢?操作系统:windows laravel 5.2【参考方案2】:

对于 Azure,您可以为您的网络应用创建一个新的网络作业,然后上传一个 .cmd 文件,其中包含这样的命令。

php %HOME%\site\wwwroot\artisan queue:work --daemon

并将其定义为触发和 0 * * * * * 频率 cron。

这种方式对我有用。

最好的。

【讨论】:

应用服务的 Web 作业只有 4 个属性:名称、文件上传、类型和规模。您是否检查了您的 php 路径,并在您的 cmd 文件上进行了修改? 如果和我建议的不一样?您还可以在您的应用服务上安装 Kudu 并验证当您在此路径中调用 artisan 时所有路径都正常。 感谢@ErnestoLugo,这是天蓝色的做法。现在您可以创建一个连续的和触发的网络作业,连续将保持工作程序守护进程运行。 从 laravel 5.3 开始,不再需要 --daemon 标志。 queue:work 默认是一个守护进程。您可以使用 --once 标志仅运行一项作业。【参考方案3】:

首先,您不能在 Azure 上将 WebJob 与 Laravel 一起使用。 Azure PHP Web 应用托管在 Linux 上。 WebJobs 目前不适用于 Linux。

在 Azure 上的 Laravel 中执行 chron 作业的最佳方法是创建一个 Azure 逻辑应用程序。您使用 Recurrence 触发器,然后使用 HTTP 操作将 POST 请求发送到您的 Laravel Web 应用程序。您使用此周期性心跳来运行您需要执行的任何操作。请务必在您的 POST 请求中添加身份验证。

您将遇到的下一个问题是 POST 将是同步的,因此您正在做的工作不能广泛,否则您的 HTTP 请求将超时,或者您将达到 PHP 脚本的时间限制(60 秒)。

解决方案不是 Laravel Jobs,因为这里你需要在后台运行一些东西来处理队列。

解决方案也不是 PHP 线程。标准 Azure PHP Web 应用不支持 PHP 线程。您当然可以构建自己的 Web 应用程序并启用 PHP 线程,但这确实是逆流而上。

您只需要使用同步逻辑即可。因此,您对心跳所做的工作应该不会超过大约 60 秒。

如果您需要更广泛的处理,那么您确实需要将其卸载到另一个地方:另一个 Web 应用程序、Azure 函数等。

但为什么不首先这样做呢?原因是成本和复杂性。如果你有一些简单的东西……比如每日报告……你只需将报告连接到心跳,所有生成报告的工具都在 Laravel 中。将每日报告分离到自己的容器中需要设置,并且运行它的 Web 应用程序会产生成本……在我看来,因为一些简单的事情不值得。

【讨论】:

以上是关于Laravel:运行队列:在 Windows Azure Web App 上连续监听的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 运行队列处理器 queue:work 与 queue:listen 区别及 Windows 终端命令问题

我将如何在后台运行 Laravel 5.2 的队列监听器?

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

自动运行 Laravel 队列 [重复]

Laravel - 在运行前获取队列数据

Laravel 队列永远运行