8768 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai créé une application web qui permet à un administrateur d'ajouter un ou plusieurs fichiers audio à un compte client via plusieurs formulaires qui se succèdent sur 3 pages, en 3 étapes différentes donc. Cette application tourne avec PHP 7.1 sur un serveur mutualisé. Il n'y a rien de bien compliqué dans son fonctionnement :

- La page 1 permet de rechercher et sélectionner un compte client parmi ceux existants.
- La page 2 permet de nommer le dossier, d'y ajouter une description et de sélectionner un ou plusieurs fichiers audio sur l'ordinateur de l'administrateur puis de les télécharger et d'enregistrer tout ça en BDD.
- La page 3 permet ensuite de renommer le(s) fichier(s) audio précédemment téléchargés si besoin.

Mon problème se situe au niveau de la deuxième page, lorsque j'essaie de télécharger un fichier de 69Mo via le formulaire. Mon script est d'abord un enchainement de conditions qui testent si les champs sont bien renseignés, si les variables ont bien étés initialisées, si le nom n'est pas trop long, etc... bref, la routine Smiley smile
Mis à part avec ce fichier audio de 69Mo, mon application fonctionne correctement avec tous les autres fichiers de taille inférieure.

Si toutes les conditions en amont sont vraies, alors on peut enfin télécharger le(s) fichier(s), les renommer et enregistrer le tout en BDD puis on redirigera l'utilisateur à l'étape suivante. Je vous passe toutes les conditions qui précèdent et vous fourni que l'essentiel du code si ça peut aider, à savoir la boucle de téléchargement multi-fichiers :


# Boucle de téléchargement multi-fichiers :
          	for($i=0; $i<count($_FILES['fichiers']['name']); $i++)
            {
          		# On traite les fichier un par un :
          		# On vérifie le nom :
          		if(strlen($_FILES['fichiers']['name'][$i])<=4) {
                $error = 'Veuillez donner un nom à votre fichier.';
          		}

          		# On vérifie les erreurs
          		if($_FILES['fichiers']['error'][$i] !=0){
          			$error = 'Le fichier N°'.$i.' contient des erreurs : téléchargement annulé.' ;
          		}

          		# Puis on déplace le fichier $i sur le serveur et on le renomme :
          		if(move_uploaded_file($_FILES['fichiers']['tmp_name'][$i], "../uploads/".$nomFichier)) {

              # Insertion dans la BDD :
              $ajouterfichier = $bdd->prepare('INSERT INTO fichiers_audio(nom, description, chemin, nom_fichier, droits) VALUES(?, ?, ?, ?, ?)');
              $ajouterfichier->execute(array($nom, $description, $nom."-".$_FILES['fichiers']['name'][$i], $nom."-".$_FILES['fichiers']['name'][$i], $id));

              # Quand la boucle se termine : succès ; on redirige l'utilisateur vers l'étape suivante :
                if ($i<count($_FILES['fichiers']['name'])) {
                  header('Location:ajouter-fichiers-3.php?success=1');
                }
              }
              else {
                $error = 'Erreur : un problème est survenu lors du téléchargement du fichier.' ;
                }
              }


Lorsque je sélectionne ce fichier de 69Mo au format .wav (qui sont bien plus volumineux que les .mp3), mon script tourne pendant 10-15 secondes à peine et la page actuelle se ré-actualise. Du coup, on perd toutes les infos qui proviennent de la page 1 mais PHP ne m'affiche aucune erreur de son côté...

Je suis allé jeter un coup d'oeil dans les logs du côté du serveur, et j'ai cette ligne qui s'inscrit lorsque ce problème se produit :

[#Nom du serveur][Thu Apr 04 14:47:29.753023 2019] [cgi:error] [pid 120664] (70008)Partial results are valid but processing is incomplete: [client (#adresse IP)] AH01225: Error reading request entity data, referer: (#URL de la page concernée, la page 2 de mon script)


Quelqu'un peut-il m'aider à interpréter cette erreur ? J'ai d'abord essayé de modifier les directives internes du php.ini en début de script (max_execution_time, max_input_time, post_max_size) mais comme je le pensais, ça n'a eu aucun effet, l'hébergeur ne permettant certainement pas de modifier ces valeurs.
Actuellement, mon hébergeur à mis Max_execution_time à 40, max_input_time à 40 également et post_max_size à 50M.

Je recherche donc une solution pour soit :
- permettre à l'utilisateur de pouvoir télécharger des fichiers plus volumineux, si c'est possible évidement (peu probable à mon avis)
- le cas échéant pouvoir au moins gérer cette erreur correctement, mais vu qu'elle provoque un rechargement de la page c'est plus délicat...

Il me semble que 69Mo, c'est pas tant volumineux que ça non ?

Je remercie d'avance toutes les âmes charitables qui voudront bien m'aider et me mettre sur une piste pour diagnostiquer et gérer cette erreur convenablement Smiley smile

S'il manque quoi que ce soit comme informations, n'hésitez pas à me le dire.

Loraga
Bonjour,

Je n'arrive toujours pas à trouver la bonne méthode pour débogguer correctement ce problème et trouver une solution.

J'ai en attendant effectué d'autres tests ; vu que le phpinfo m'indique que la taille maximum d'un fichier à télécharger sur le serveur est de 50Mo, j'ai donc essayé avec un fichier de 49,4Mo. Et ça ne fonctionne pas non plus, sauf que cette fois-ci, je n'obtiens pas un rechargement de la page mais une erreur du navigateur Firefox :

Échec de la connexion sécurisée

La connexion avec le serveur a été réinitialisée pendant le chargement de la page.

• La page que vous essayez de consulter ne peut pas être affichée car l’authenticité des données reçues ne peut être vérifiée.
• Veuillez contacter les propriétaires du site web pour les informer de ce problème.


Et aucune inscription d'une quelconque erreur du côté des logs du serveur cette fois-ci...

Mon client à une connexion fibre, et par contre il arrive sans problème à télécharger un fichier de 49,4Mo...
Cela aurai-il un rapport avec le temps d'execution du script qui serait plus long chez moi à cause de ma connexion ?

Donc en gros, il faudrait que je gère deux cas d'erreurs supplémentaires dans ce script, à défaut d'une autre solution :
• Si le script met plus de 40 secondes à s'exécuter
• Si le fichier pèse 50Mo ou plus

Si quelqu'un peut également m'expliquer ce que signifie l'erreur dans les logs du serveur de mon précédent message, ça m'intéresse Smiley smile

Et enfin, si quelqu'un à quoi que ce soit pour m'aider ou me mettre sur une piste sur comment débogguer voir résoudre ce souci je suis preneur.

Merci d'avance ! Smiley smile
Tu as regardé comment tester avec javascript pour le poids de ton fichier ?

Autrement je pense qu'il faut un serveur conséquent pour faire ce genre de chose. Si tu n'as aucun moyen d'augmenter le temps d'exécution tu vas être coincé.
Depassage a écrit :
Tu as regardé comment tester avec javascript pour le poids de ton fichier ?

Non, je n'ai actuellement aucune idée de comment faire mais je suis en train de faire des recherches du coup Smiley cligne .
Je suis une quille en javascript mais ça me fera apprendre un peu avant de me mettre sérieusement à l'apprentissage de ce nouveau langage qui est incontournable.

Ici, javascript permettrait de tester la taille du fichier avant d'entrer dans le long traitement du fichier avec PHP. On pourrait alors indiquer à l'utilisateur que son fichier est trop lourd rapidement. C'est une bonne idée, merci !

Depassage a écrit :
Autrement je pense qu'il faut un serveur conséquent pour faire ce genre de chose. Si tu n'as aucun moyen d'augmenter le temps d'exécution tu vas être coincé.

Je tente quand même de voir avec l'hébergeur, j'imagine qu'il y a aucun moyen de modifier le temps d'exécution mais peut être me proposeront-ils une offre ou une solution qui pourrait convenir... sait on jamais.

Merci pour ton aide ! Smiley lol
Les hébergeur se servent de se genre de limite pour te vendre des offres plus chères (et pour éviter de mettre toute leur infrastructure par terre aussi Smiley murf ). Après 40 secondes c'est quand même très court même pour du mutualisé.

Sinon tes fichiers me paraissent plutôt lourd pour du son uniquement.
Depassage a écrit :
Les hébergeur se servent de se genre de limite pour te vendre des offres plus chères (et pour éviter de mettre toute leur infrastructure par terre aussi Smiley murf ). Après 40 secondes c'est quand même très court même pour du mutualisé.

Sinon tes fichiers me paraissent plutôt lourd pour du son uniquement.


Salut
C'est vrai que 60Mo pour un sons, c'est qu'il doit durer plus d'une heure ^^

Concernant les timeout et compagnie, soit tu as accès au php.ini et te règles tous les timer, soit tu demande à ton hebergeur.
Bonjour,

Merci pour votre aide et vos conseils à tous les deux Smiley smile

L'hébergeur m'a confirmé que je peux modifier la valeur de max_execution_time mais bien évidement pas celle de post_max_size. Je viens de tester à nouveau avec mon fichier de 49Mo et ma connexion moyenne, ça fonctionne très bien désormais.

Sinon, je vais faire comme Depassage à dit, c'est à dire contrôler si la taille du/des fichier(s) ne dépassent pas 50Mo avec JavaScript avant d'entrer dans le traitement du fichier avec PHP.

Si les fichiers sont si lourd, c'est parce qu'ils sont au format .wav, c'est pas compressé du tout. Pour exemple, un fichier .wav de 50Mo ne dure que 6 minutes... Evidement, en .mp3 il ferait moins de 10Mo, mais la qualité de l'audio serait moindre. Hélas, je n'ai pas réussi à convaincre mon client de n'utiliser que du mp3 Smiley lol

Merci à vous ! Smiley smile
Whaw c’est dingue ! J’ai demandé gentiment à l'hébergeur s’il y avait pas moyen d’augmenter la valeur de post_max_size.
Hé bien ils m’ont dit oui ! Ils passent la valeur à 100Mo dans les jours qui viennent, c'est un geste vraiment sympa de leur part Smiley smile
Modifié par Loraga (20 Apr 2019 - 12:14)