Skip to content
Advertisement

Laravel controller function times out, 50000 users

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

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement