我遇到了一个问题,我的数据库调用显着减慢了页面加载速度。我正在从选举数据中填充多个图表,我的表包含大约 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 artisan queue:table
它给了我以下错误
[InvalidArgumentException]
A CreateJobsTable migration already exists.
Run Code Online (Sandbox Code Playgroud)
这是因为我已经将迁移命名CreateJobsTable为其他目的.我无法重命名此表和迁移.有没有办法将迁移重命名为CreateJobsQueueTable或某些相关的东西?
我们可以使用'queue:table'重命名artisan创建的jobs表吗?
我正在使用 laravel 队列作业发送带有 excel 附件的电子邮件。很多时候,每当我更新任何代码更改时,它都不会考虑更新的代码,而是运行旧代码。我怎样才能防止这种情况?
我找到了在 Laravel 中使用 RabbitMQ 的著名库。
在配置中config/queue.php
我只能指定一个交换和队列名称。是否支持多种交换?
我们有一个作业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 中执行某些操作?该进程崩溃的时间似乎非常奇怪。
在我的邮件模板中,我使用的图像路径如下:
<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) 嗨,我创建了一个 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)
但它不作为后台运行,该功能正在等待队列完成,请帮帮我
我有一个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秒内运行。它只是在队列中吓坏了。
我正在尝试在我的网站上设置一个联系表单,当有人单击“发送”时,就会运行一个作业,并在该作业中向所有管理员用户发送通知。不过,我在失败的作业表中不断收到此错误:
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 工作链
Job1::withChain([
new Job2(),
new Job3(),
new Job4()
])->dispatch();
Run Code Online (Sandbox Code Playgroud)
有时我希望它同步运行作业。
但是当我更改->dispatch()为时->dispatchNow(),我得到
调用未定义的方法 Illuminate\Foundation\Bus\PendingChain::dispatchNow()
还有其他方法可以同步运行作业链吗?
laravel ×10
laravel-queue ×10
php ×5
laravel-5 ×2
asynchronous ×1
laravel-5.3 ×1
laravel-5.4 ×1
laravel-5.8 ×1
rabbitmq ×1