我最近在 Laravel 项目上安装了 Horizon,该项目在 Homestead Vagrant 机器上运行。
我的问题是队列工作人员没有接到任何工作。我没有主管:
vagrant@homestead:~/Code/project$ artisan horizon:list
+----------------+------+-------------+---------+
| Name | PID | Supervisors | Status |
+----------------+------+-------------+---------+
| homestead-D2dV | 7094 | None | running |
+----------------+------+-------------+---------+
vagrant@homestead:~/Code/project$ artisan horizon:supervisors
No supervisors are running.
Run Code Online (Sandbox Code Playgroud)
这是我的主管 (horizon.conf) 配置:
[program:horizon]
process_name=%(program_name)s
command=/usr/bin/php /home/vagrant/Code/project/artisan horizon
autostart=true
autorestart=true
user=vagrant
redirect_stderr=true
stdout_logfile=/home/vagrant/Code/project/storage/logs/horizon.log
Run Code Online (Sandbox Code Playgroud)
当我启动这台机器时,我的日志和 Web 界面显示“ Horizon 已成功启动。 ”。
还有我的地平线(horizon.php)配置:
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default', 'queue-1', 'queue-2', 'queue-3'],
'balance' => 'auto', …Run Code Online (Sandbox Code Playgroud) 我们的 Laravel 应用程序在 Kubernetes 中有两个不同的 Pod,
问题是当我检查地平线仪表板时,它显示“活动”,我可以在“待处理作业”部分看到作业,但它们从未真正执行过。他们只是坐在那里闲着。
现在,当我在运行 apache 的 pod 中使用 SSH 并手动运行命令“php artisan horizon”时,它实际上会执行所有挂起的作业。
我已经确保了以下几点:
我正在使用 Laravel 5.5 并且我正在尝试设置一些快速队列处理。我遇到了一个又一个的障碍。
该网站是雇主/雇员匹配服务。因此,当雇主发布工作职位时,它需要遍历我们系统中的所有员工并计算一些变量,以确定他们与工作的匹配程度。我们已经弄清楚了这一切,但是当系统中有数千名员工时,一次处理一个需要很长时间。所以,我准备写几个表。第一个是定义位置 ID 和状态的简单表。第二个表列出了所有员工 ID、职位 ID 和正在处理的员工的状态。这只需几秒钟即可写入,然后允许用户在应用程序中继续前进。
然后我有另一个服务器设置,每分钟运行一个 cron,检查第一个表中的新条目。找到后,它会将其标记为已开始,然后抓取所有员工并遍历每个员工并在 Laravel 中启动排队作业。我定义的作业确实正确提交到队列,而运行queue:work实际上确实正确处理了作业。这都是经过测试的。
但是,我遇到的问题是,我已经为队列尝试了数据库 (MySQL)、Redis 和 SQS,但它们都非常慢。我正在使用同一台服务器来尝试操作queue:work(使用 Supervisor 并尝试运行多达 300 个进程),但随后创建了 3 个不运行 cron 而仅运行 Supervisor(每个克隆 100 个进程)的克隆,并在第一个服务器。使用数据库它可以正常处理,尽管运行 10k 排队作业需要几个小时,但是使用 SQS 和 Redis 我遇到了很多失败。脚本花费的时间太长或什么的。我检查了运行 worker 的克隆上的 CPU,它们几乎没有达到 40%,所以我不会对服务器过度征税。
我只是在阅读有关地平线的信息,我不确定它是否对这种情况有所帮助。我一直在寻找有关如何使用 Laravel 正确设置队列处理系统的信息,并且一直遇到的问题多于答案。
有没有人熟悉这些东西并且对如何正确设置它有任何建议,以便它非常快速且无故障(假设我的代码没有错误)?
更新:根据其他一些帖子建议,我想我会分享更多细节:
三个克隆中的每一个都具有以下工作器配置:
command=php /home/forge/default/artisan queue:work sqs --sleep=10 --daemon --quiet --timeout=30 --tries=3
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=forge
numprocs=100
stdout_logfile=/home/forge/.forge/worker-149257.log
Run Code Online (Sandbox Code Playgroud)数据库位于 Amazon RDS 上。
我很好奇 …
如何重试Laravel Horizon 中所有失败的作业?似乎没有“全部重试”按钮,并且 artisan 命令不起作用,因为失败的作业未存储在表中。
我在OSX MAMP Pro中使用laravel / horizon
当我运行作曲家要求 laravel/horizon:~1.0
它说 -
laravel / horizon v1.0.8需要ext-pcntl *->您的系统中缺少所请求的PHP扩展pcntl。
我检查/Applications/MAMP/bin/php7.1.1/php/ext文件夹,它没有pcntl扩展名。
我该如何安装?
在 Forge 和 Redis 上使用 Laravel Horizon,我有一个default队列和一个notifications队列。
通知作业都在最近的作业下建立了暂停状态,并且不会得到处理。这是使用的代码:
$event->owner->notify((new ItemWasLiked($event))->onQueue('notifications'));
Run Code Online (Sandbox Code Playgroud)
我发现处理它们的唯一方法是手动显式运行以下命令以notifications进行处理:
php artisan queue:work --queue=notifications
Run Code Online (Sandbox Code Playgroud)
当它进来时,这不应该是自动的吗?我错过了什么?
我正在使用最新版本的 Homestead。我也设置了 Laravel Horizon。我使用 Redis 作为队列驱动程序。Laravel 是 5.6 版,是全新安装的。
发生的事情是我的工作都失败了(即使工作正确退出)。
我使用自定义命令通过命令行运行作业:
vagrant@homestead:~/myapp$ artisan crawl:start
vagrant@homestead:~/myapp$ <-- No CLI errors after running
Run Code Online (Sandbox Code Playgroud)
<?php
namespace MyApp\Console\Commands;
use Illuminate\Console\Command;
use MyApp\Jobs\Crawl;
class crawl extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'crawl:start';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Start long running job.';
/**
* Create a new command instance.
*
* …Run Code Online (Sandbox Code Playgroud) 我在作业队列中的跟踪标签未显示我期望的标签。更改为类后,作业不会处理。
我的工作示例班是:
class EmailUser implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* The user instance.
*
* @var \App\User
*/
public $user;
/**
* Create a new job instance.
*
* @param \App\User $user
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Mail::to('fesher@example.com')->send(new ApplicationReceivedEmail());
}
/**
* Get the tags that should be assigned to the job.
*
* …Run Code Online (Sandbox Code Playgroud) 我正在学习 Laravel,正在从事一个运行 Horizon 以了解工作的项目。我被困在一个地方,我需要一次又一次地运行相同的工作。
这是我目前正在做的
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\Subscriptions;
class MailController extends Controller
{
public function sendEmail() {
Subscriptions::all()
->each(function($subscription) {
SendMailJob::dispatch($subscription);
});
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,除了它在多个工作人员之间运行作业并且没有保证的顺序。有没有办法一个接一个地运行作业?
我已将 Laravel 安装在子文件夹中,并正在尝试安装 Horizon。路由到“test.com/sub-folder/horizon”后,所有损坏的设计以及内部链接都指向主域而不是主域无子文件夹。
经过搜索,这似乎是已知问题,github问题中已经报告了
当 Laravel 安装在子文件夹中时,是否有任何解决方法可以使 Horizon 工作?
我在 laravel 5.7 项目上安装 laravel Horizon 并按如下方式配置:
'domain' => null,
'path' => 'horizon',
'use' => 'default',
'prefix' => env('HORIZON_PREFIX', 'horizon:'),
'waits' => [
'redis:default' => 60,
],
'trim' => [
'recent' => 60,
'completed' => 60,
'recent_failed' => 10080,
'failed' => 10080,
'monitored' => 10080,
],
'fast_termination' => false,
'memory_limit' => 64,
'environments' => [
'production'=>[
'save_report' => [
'connection' => 'redis',
'queue' => ['save_report'],
'balance' => 'auto',
'processes' => 5,
'tries' => 1,
],
],
'local' => [
'save_report' …Run Code Online (Sandbox Code Playgroud) 由于我已将Laravel应用程序从5.4升级到5.5,并添加了Laravel Horizon,因此我的队列不再起作用。这是起作用的旧情况:
我使用的驱动程序是Beanstalkd和Supervisord,用于监视任务并使其正常运行。我使用以下命令运行它:
php artisan queue:work --tries=1 --queue=high,medium,low
Run Code Online (Sandbox Code Playgroud)
新情况:我已将队列驱动程序更新为Redis。当我查看mydomain.com/horizon时,我看到有任务正在执行但尚未处理。从终端运行以下命令也不起作用:
php artisan queue:work --tries=1 --queue=high,medium,low
Run Code Online (Sandbox Code Playgroud)
我有2个队列已填充,Redis队列和Beanstalkd队列。如何完成Beanstalkd队列,然后处理Horizon队列?
laravel-horizon ×12
laravel ×11
php ×7
laravel-5 ×3
queue ×2
docker ×1
email ×1
homestead ×1
kubernetes ×1
laravel-5.5 ×1
laravel-5.8 ×1
laravel-jobs ×1
mamp ×1
redis ×1
tags ×1