首页 > 开发 > MySQL > 正文

laravel 队列问题

2017-09-08 08:50:35  来源:网友分享

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