I'm with @emilmoe on this in regards to using an artisan command.
I've typically handled this with an async workflow that has worked well.
- User uploads the file from a form
- Store the file and trigger an event or queue for processing (gets processed by an artisan command)
- Redirect the user to an upload status page that using a javascript interval to check on the status of processing via ajax utilizing an endpoint with a tracking identifier
- When the interval response returns a processed status redirect the user to where they need to be.
I've also used the method that method that @emilmoe mentioned with using ajax to send chunk start and end identifiers back and forth.