1、描述
laravel 5.4 ,本地测试队列正常,放到生产上 发现数据结果错误,查了下日志每个任务都执行了,就是执行到一半的感觉,因为结果数据是数字累加,本地正确,生产上每次执行后的结果都不一样。比如:每天用户的一个字段要+1+2+3+4+。。。,本地计算是100,属于正确结果,而在生产liunx上是87,每次模拟执行任务,算出来的结果都是100以下,而且每次都不一样。
业务:
用户注册送100积分,每天返1%,可以邀请1,2,3层的用户,每一层返的积分比例不同,每执行一个任务,基本会涉及N张表的查询,然后更新用户积分字段。
补充:用的是godaddy服务器,centos 7,环境lnmp1.4
2、相关代码
以下是生产上Supervisor的配置文件:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/wwwroot/www.xxxxx.com/artisan queue:work --sleep=3 --tries=1 --timeout=60
autostart=true
autorestart=true
numprocs=8
user=www
redirect_stderr=true
stdout_logfile=/home/wwwroot/www.xxxxx.com/storage/logs/queue-listener.log
以下是计算的方法:
<?php
namespace App\Jobs;
use Exception;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Http\Controllers\Admin\Manage\IntegralController;
use Illuminate\Support\Facades\Log;
class CalcKhIntegral implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
//最大任务数
public $tries = 1;
//超时时间
public $timeout = 10;
protected $data;
protected $integral;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($data)
{
$this->data = $data;
$this->integral = new IntegralController();
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// Log::info('job控制器');
Log::error('uid+:'.$this->data);
$this->integral->dailyEarnings($this->data);
}
public function failed(Exception $e)
{
Log::error('integral error, uid:'.$this->data.' .datatime: '.time());
// .'错误提示:'.$e->getMessage().'错误代码:'.$e->getCode()
}
}
以下是调用任务的方法:
public function everydayjs(){
$user = $this->users->where('user_id','!=',1)->where('user_id','!=',8)->where('user_id','!=',9)->get()->toArray();
foreach ($user as $k=>$v){
$his = date('H:i:s',$v['previous_date']);
$ymd = date('Y-m-d',time());
$datetime = strtotime($ymd.' '.$his);
$datetime = date('Y-m-d H:i:s',$datetime);
$job = (new CalcKhIntegral($v['user_id']))
->delay(Carbon::parse($datetime));
$this->dispatch($job);
}
}
3、日志信息无报错
[2017-09-06 22:42:21] Processing: AppJobsCalcKhIntegral
[2017-09-06 22:42:21] Processing: AppJobsCalcKhIntegral
[2017-09-06 22:42:22] Processing: AppJobsCalcKhIntegral
..........
4、尝试了几种解决方法
起初以为是任务执行时间问题,后来设置了60秒,还是一样。
试试把numprocs设置为1