标签: laravel-queue

Laravel 中的多线程

我遇到了一个问题,我的数据库调用显着减慢了页面加载速度。我正在从选举数据中填充多个图表,我的表包含大约 100 万行,我必须在方法内的每个方法中多次查询这些数据getCharts()

我正在使用它来将返回数据传递给 JavaScript。

当您单击数据点时,这些图表会重新填充。因此,如果您单击一个点 ie ('democrat),它将重新加载页面并再次调用这些方法。

我要问的是是否有可能在原生 PHP 中做这样的事情。服务器在 linode 上运行 PHP 5.2。

foreach(function in getChartsMethod){
     Start a child thread to process the function. 
}  
join the threads. 
reload the page. 


public function getCharts(){
        $this->get_cast_chart();
        $this->get_party_chart();
        $this->get_gender_chart();
        $this->get_age_chart();
        $this->get_race_chart();
        $this->get_ballot_chart();
        $this->get_county_chart();
        $this->get_precinct_chart();
        $this->get_congressional_district_chart();
        $this->get_senate_district_chart();
        $this->get_house_district_chart();
        return view('elections.index');
    }
Run Code Online (Sandbox Code Playgroud)

样品方法

public function get_party_chart(){
        $query = DB::table($this->tableName)
            ->select('party', DB::raw('count(*) as numVotes'))
            ->groupBy('party')
            ->orderBy('numVotes', 'ASC');

        if ($this->filterParameters != null){
            $query = $query->where(key($this->filterParameters), $this->operator, current($this->filterParameters));
        }
        $chartData = …
Run Code Online (Sandbox Code Playgroud)

php multithreading asynchronous laravel laravel-queue

4
推荐指数
1
解决办法
3万
查看次数

在Laravel队列/重命名作业表中自定义作业和作业表

当我尝试php artisan queue:table 它给了我以下错误

  [InvalidArgumentException]                   
  A CreateJobsTable migration already exists.  
Run Code Online (Sandbox Code Playgroud)

这是因为我已经将迁移命名CreateJobsTable为其他目的.我无法重命名此表和迁移.有没有办法将迁移重命名为CreateJobsQueueTable或某些相关的东西?

我们可以使用'queue:table'重命名artisan创建的jobs表吗?

php laravel laravel-queue

4
推荐指数
1
解决办法
2816
查看次数

Laravel 队列作业不会更新到最新代码

我正在使用 laravel 队列作业发送带有 excel 附件的电子邮件。很多时候,每当我更新任何代码更改时,它都不会考虑更新的代码,而是运行旧代码。我怎样才能防止这种情况?

laravel laravel-5 laravel-queue laravel-5.4 laravel-artisan

4
推荐指数
1
解决办法
4085
查看次数

如何在 laravel-queue-rabbitmq 中配置多个交换?

我找到了在 Laravel 中使用 RabbitMQ 的著名库。

在配置中config/queue.php 我只能指定一个交换和队列名称。是否支持多种交换?

rabbitmq laravel laravel-5 laravel-queue

4
推荐指数
1
解决办法
2421
查看次数

如何调试队列中作业之间的退出代码 12:工作

我们有一个作业MyPrettyJob,它通过 redis 从控制器排队。当我们像这样从命令运行此作业时,该作业确实成功了。当我们运行包含少量数据的作业时,队列保持在线状态,但是当我们运行包含大量数据的作业时,队列崩溃,退出代码为 12,这表明出现“内存不足”错误。

这个大型作业处理大约 300,000 个项目,这些项目大多相互依赖。为此,我们无法在不造成严重性能影响的情况下真正拆分这项工作。在某些极端情况下,可能需要长达数小时的时间,而不是目前需要的几分钟。

对于大型作业,队列输出以下内容:

$ php artisan queue:work --queue=myqueue
Processing: App\Jobs\MyPrettyJob
Processed: App\Jobs\MyPrettyJob
$ echo $?
12
Run Code Online (Sandbox Code Playgroud)

无论是否有东西在该作业后面排队,队列工作人员甚至会崩溃。这似乎表明队列在清理大型作业时崩溃了,但似乎没有给出任何迹象表明那是什么。无论是否完成任何数据库交互,队列工作程序也会崩溃,这规则了与数据库相关的任何内容。

队列在作业之间做什么?我可以以任何方式调试为什么它在完成工作后内存不足吗?队列是否可能会向日志写入某些内容,或者是否在作业之间在 Redis 中执行某些操作?该进程崩溃的时间似乎非常奇怪。

laravel laravel-queue

4
推荐指数
1
解决办法
3232
查看次数

图像未显示在队列中的邮件中 - laravel

在我的邮件模板中,我使用的图像路径如下:

<img src="{{ URL::to('/images/logo.png') }}" alt="logo" download="false" style="width:50%">
Run Code Online (Sandbox Code Playgroud)

它适用于普通邮件(没有队列),但不适用于队列中的邮件。

通过检查邮件中的元素,我发现正常邮件图像路径如下:

https://app.site_domain.com/images/logo.png //as expected 
Run Code Online (Sandbox Code Playgroud)

但对于邮件队列来说是:

http://localhost/images/logo.png
Run Code Online (Sandbox Code Playgroud)

php laravel laravel-queue

4
推荐指数
1
解决办法
2638
查看次数

Laravel 队列不作为后台运行

嗨,我创建了一个 Laravel 队列作业来发送邮件

public function handle() {
    foreach($this->emails as $value) {
            $to         = $value->email;
            $subject    = $this->data['subject'];       
            $this->data['t_firstname']    = $value->firstname;
            $this->data['t_lastname']     = $value->lastname;
            if (view()->exists('mail.requirement_to_tutor')) {
                    $view = view('mail.requirement_to_tutor',$this->data);
                    $html = $view->render();
            }
            file_put_contents('test.txt', 'test database');
            $body = $html;
            $headers  = "From: " . $this->data['from'] . "\r\nReply-To: " . $this->data['from'] . "";
            $headers .= "MIME-Version: 1.0\r\n";
            $headers .= "Content-type: text/html; charset: utf8\r\n";
            mail($to, $subject, $body, $headers);
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我正在从 repo 推送数据

$obj = (new SendStudentRequirement($TutorsbyCity,$data));
$this->dispatch($obj);
Run Code Online (Sandbox Code Playgroud)

但它不作为后台运行,该功能正在等待队列完成,请帮帮我

php laravel laravel-queue

3
推荐指数
1
解决办法
4426
查看次数

Laravel使作业排队的时间比超时还要长

我有一个Laravel排队的工作,它从网页中提取链接。通过Laravel Forge配置的队列侦听器的超时为240秒(4分钟)。但是,作业最多需要45分钟才能运行。

我的队列设置是:

'redis' => [
    'driver' => 'redis',
    'connection' => 'default',
    'queue' => 'default',
    'retry_after' => 350,
],
Run Code Online (Sandbox Code Playgroud)

并且有多个作业流程正在运行-多达35个流程。可以想象,这正在消耗大量服务器内存。这些过程似乎一直徘徊。这些过程的命令如下所示top

php7.1 artisan queue:work redis --once --queue=linkqueue --delay=0 --memory=128 --sleep=10 --tries=1 --env=local
Run Code Online (Sandbox Code Playgroud)

如果超时为240秒,作业如何运行45分钟?为什么会有这么多流程-不应该只有一个流程吗?

还有,为什么要提取链接的脚本要花45分钟才能运行?

该脚本确实可以正常工作,也就是说,在大多数情况下,它可以按预期运行-只是需要一段时间。据我所知,没有报告/记录错误。

工作中的代码是:

$dom = new DOMDocument;
$dom->loadHTML($html);
$links = $dom->getElementsByTagName('a');

foreach ($links as $a) {
    $link = $a->getAttribute('href');

    $newurl = new URL;
    $newurl->url = $link;
    $newurl->save();
}
Run Code Online (Sandbox Code Playgroud)

更新:另一个简单的工作就可以在不到一秒钟的时间内运行良好。特别是上面的链接作业​​需要10分钟的时间。可能是RAM问题吗?我还能做些什么来诊断问题?作为控制台作业的一部分运行时,提取链接功能本身将在1或2秒内运行。它只是在队列中吓坏了。

php laravel laravel-queue laravel-5.3

3
推荐指数
1
解决办法
1394
查看次数

Laravel 作业/通知失败

我正在尝试在我的网站上设置一个联系表单,当有人单击“发送”时,就会运行一个作业,并在该作业中向所有管理员用户发送通知。不过,我在失败的作业表中不断收到此错误:

Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\Contact]. in /var/www/html/leonsegal/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:412
Run Code Online (Sandbox Code Playgroud)

我已经检查了我的代码,但看不出我做错了什么。有人可以帮忙吗?

这是我的控制器:

<?php

namespace App\Http\Controllers;

use App\Contact;
use App\Jobs\SendContactJob;

class ContactController extends Controller
{
    /**
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function create()
    {
        return view('contact');
    }

    public function store()
    {
        request()->validate([
            'name' => 'required|max:255',
            'email' => 'required|email|unique:contacts|max:255',
            'message' => 'required|max:2000',
        ]);

        $contact = Contact::create(
            request()->only([
                'name',
                'email',
                'message',
            ])
        );

        SendContactJob::dispatch($contact);

        return back()->with('success', 'Thank you, I will be in touch as soon as I can');
    }
}
Run Code Online (Sandbox Code Playgroud)

我的工作:

<?php

namespace …
Run Code Online (Sandbox Code Playgroud)

laravel laravel-queue

3
推荐指数
1
解决办法
4171
查看次数

同步运行 Laravel 作业链

我有一个像这样的 Laravel 工作链

Job1::withChain([
  new Job2(),
  new Job3(),
  new Job4()
])->dispatch();
Run Code Online (Sandbox Code Playgroud)

有时我希望它同步运行作业。

但是当我更改->dispatch()为时->dispatchNow(),我得到

调用未定义的方法 Illuminate\Foundation\Bus\PendingChain::dispatchNow()

还有其他方法可以同步运行作业链吗?

laravel laravel-queue laravel-5.8

3
推荐指数
1
解决办法
3749
查看次数