In my controller I have a have a function to check subscription status and update it in my database. The problem is with 50000 users, it takes too long to finish and times out.
public function UpdateStatus(){
    $users = User::all();
    foreach($users as $user){
        $user->createOrGetStripeCustomer();
        $stripeSubs = $user->asStripeCustomer()->subscriptions->all();
        $dbSubs = DB::table('subscriptions')->select('stripe_id')->where('user_id', $user->id)->get();
        foreach($dbSubs as $check){
            $canDelete=0;
            foreach($stripeSubs as $value){
                if($check->stripe_id == $value->id){
                    $canDelete++;
                }
            }
            if($canDelete==0){
                DB::table('subscriptions')->where('user_id', $user->id)->where('stripe_id',$check->stripe_id)->update(['stripe_status'=>'ended']);
            }
        }
        
    }
    
    return redirect('/dashboard');
}  
I’m sure I shouldn’t even process that many at a time but I kinda got stuck here and am not sure how exactly to approach this. My goal is to make this work and optimize it.
Advertisement
Answer
you use job like that:
php artisan make:job checkSubscrption
in your env file change Queue_CONNECTiON=database,
run php artisan queue:table and php artisan migrate
in your checkSubscription file set that
public function handle(){
            $users = User::all();
  
foreach($users as $user){
    $user->createOrGetStripeCustomer();
    $stripeSubs = $user->asStripeCustomer()->subscriptions->all();
    $dbSubs = DB::table('subscriptions')->select('stripe_id')->where('user_id', $user->id)->get();
    foreach($dbSubs as $check){
        $canDelete=0;
        foreach($stripeSubs as $value){
            if($check->stripe_id == $value->id){
                $canDelete++;
            }
        }
        if($canDelete==0){
            DB::table('subscriptions')->where('user_id', $user->id)->where('stripe_id',$check->stripe_id)->update(['stripe_status'=>'ended']);
        }
    }
    
}}
in your controller:
public function UpdateStatus(){
 checkSubscrption::dispatch();//you can use chunk method and pass your $users as params
 return redirect('/dashboard');}
then run php artisan queue:work