Предполагая, что вы уже исследовали это, потому что упоминаете, что CRON не будет вариантом, но даже непривилегированные пользователи могут установить CRON, который является самым простым решением в сочетании с планировщиком Laravel.
Если фактический CRON, использующий планировщик, действительно исключен, я думаю, что создание конечной точки HTTP, которую вы могли бы вызвать из браузера, является следующей лучшей вещью. Только не думайте, что конечная точка, которую вы можете вызвать из браузера, вы можете только позвонить из браузера;)
Взять, к примеру, https://www.easycron.com/ (нет связи, кроме первого результата Google). Вы можете настроить задание CRON, чтобы вызвать URL для запуска этих заданий в интервале CRON. Внутренне в моей компании называется "CRON бедняков":)
Я бы согласился с тем, что запуск "экранного" сеанса является наиболее ненадежным, так как при перезагрузке сервера они не запускаются снова, и если происходит сбой "бесконечного цикла", он автоматически не перезапускается.
Если вы идете по этому маршруту (или любому CRON-маршруту), вы можете добавить некоторый мониторинг, используя, например, https://healthchecks.io/ (опять-таки без присоединения, Google). Это позволяет вам определить расписание CRON и дает вам URL для вызова после его завершения, если ваш CRON не вызывает этот URL в соответствии с расписанием CRON, вы будете уведомлены. Хорошо иметь в качестве страховки.