首页 > 开发 > 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)02dcommand=php /home/wwwroot/www.xxxxx.com/artisan queue:work --sleep=3 --tries=1 --timeout=60autostart=trueautorestart=truenumprocs=8user=wwwredirect_stderr=truestdout_logfile=/home/wwwroot/www.xxxxx.com/storage/logs/queue-listener.log

以下是计算的方法:

<?phpnamespace 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