laravel 队列问题

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秒,还是一样。

阅读 4.2k
3 个回答

试试把numprocs设置为1

update user_score set score = score + 1 where user_id = 1

估计是业务逻辑出了问题,线下和线上有某些地方不一致导致的问题。
你多打些日志,开始执行的时间、结束的时间、执行中更新的哪些数据,这都可以写日志,看是存文件,还是数据库。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题