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