Salut.
Levons directement les idées reçus, tout les langages serveurs sont apte à gérer l'upload de gros fichier, et ceux de façon complétement performante. La problématique n'est pas le langage mais plutôt la technique à utiliser derrière.
Commençons par la fin, la technique développé juste après peut fonctionner en AJax ou WebSocket. N'importe quel langage acceptera les deux implémentations (et bien-sûr php y compris).
Pour upload un gros fichier, il faut le fragmenter, une fois ça fait, on envoie par packet le dit fichier, celui ci sera reconstruit coté serveur avec chacun des packets. Une fois l'envoie de tout les packets fait, on considère le fichier uploadé.
Pour faire cela coté navigateur, nous devons convertir le gros fichier en blob.
Une fois chose faites, tu auras une chaine de caractère, tu peux donc spit en packet de N charactères ta chaine et enfin l'envoyer au serveur.
Les gros sites que tu sites le font via websocket pour avoir une meilleur réactivité de ton interface (surtout le calcule de progression), éviter des requêtes inutiles etc.
Pour gérer les micro-coupures, cela complexifie grandement le code. Il faut calculer le checksum de ton blob. Dire au serveur que tu vas upload ce fichier là. Il te répond si il le connait et si il a déjà des packets en mémoire, l'upload peut donc reprendre là où ça c'est finis. Une fois tout le blob complet coté serveur il te suffit d'écrire le blob dans un fichier
Enfin coté serveur, tu devras avoir un cron permettant de nétoyer les fichiers incomplet vieu de plus de N temps.