Раз уж 504 ошибка, это значит, что сервер не успевает за отведенное ему время отдать ответ. Это и немудренно, так как ты при получении данных сразу же их обрабатываешь. Для малого количества данных этот подход уместен, но для больших - нет в чем ты уже убедился.
Решение, которые позволит тебе обрабатывать данные практически любых размеров:
1) Скрипт, который принимает данные и обрабатывает их сейчас должен сохранять их(к примеру, в файл) и ставить в очередь на обработку. Теперь твой скрипт не будет улетать в 504, так как ответ будет за считанные миллисекунды.
2) Следующим этапом будет написание скрипта, который будет получать сообщения из очереди на обработку этих данных. Если размер данных, которые ты получаешь исчисляется в сотнях мегабайтов и больше, тогда перед обработкой этих данных тебе необходимо будет их поделить на части (в случае, если хранилищем ты выберешь файлы).
3) После того, как ты получишь данные по частям ты можешь их обрабатывать в фоновом режиме
Я описал общий алгоритм, если не можешь выбрать конкретные технологии - пиши в комментарии, подскажу
UPD.
Для обработки больших файлов можно использовать генераторы -
статья
Для запуска фоновых обработчиков можно использовать cron или workers -
статья