2017-05-23 5 views
0

Je suis en train de développer une application qui devrait recevoir un fichier .CSV, l'enregistrer, l'analyser, et insert les données de chaque enregistrement into DB et à la fin supprimer le fichier.Erreur 504, l'éviter avec certaines données passant du serveur au client?

Avec un fichier avec environ 10000 enregistrements, il n'y a pas de problèmes mais avec un fichier plus grand le PHP script is correctly runned and all data are saved into DB mais est imprimé ERROR 504 The server didn't respond in time.. Je scanne le .CSV file with the php function fgetcsv();.

J'ai déjà éditer les paramètres dans php.ini fichier (max execution time (120), etc.) mais rien ne change, après 1 minute l'erreur est affichée.

J'ai également essayé d'utiliser une fonction javascript pour afficher une alerte toutes les 10 secondes mais aussi dans ce cas l'erreur est affichée.

Y at-il une solution pour éviter ce problème? Est-il possible de transmettre certaines données du serveur au client toutes les secondes pour éviter l'erreur?

Merci de

+0

504 est un délai d'expiration. Vous devez étendre la durée d'exécution autorisée dans les paramètres de votre serveur. Cependant, laisser une connexion ouverte aussi longtemps est une très mauvaise idée pour plusieurs raisons. Je vous suggère plutôt de laisser l'utilisateur télécharger le fichier, puis faire le traitement dans un processus d'arrière-plan (c.-à-CRON que vous utilisez PHP/Apache). Vous pouvez alors alerter l'utilisateur soit via l'interface utilisateur/e-mail/SMS etc lorsque le traitement est terminé –

Répondre

0

Son généralement lorsque les problèmes d'échelle apparaissent lorsque vous avez besoin pour commencer l'évolution de votre architecture de système, et votre application devront travailler de manière asynchrone. Ce problème que vous rencontrez est très courant (certains membres de mon équipe en traitent un au moment où j'écris), mais tout le monde a besoin de le faire éventuellement.

Solution 1: Cron Job

La solution la plus courante est de créer une tâche cron qui scanne périodiquement une file d'attente pour le nouveau travail à faire. Je n'expliquerai pas la nature de la file d'attente puisque tout le monde a les siens, d'autres sont corrects et d'autres sont vraiment mauvais, mais typiquement il s'agit d'une table DB avec des informations pertinentes et un statut de travail (< - une des mauvaises solutions) ou une solution impliquant Memcached, MongoDB est également très populaire.

Le "problème" de cette solution est finalement "mise à l'échelle". Les tâches Cron s'exécutent périodiquement à intervalles fixes, donc si une tâche prend un temps particulièrement long, les tâches risquent de se chevaucher. Cela signifie que vous devez travailler dans une sorte de verrouillage ou utiliser un planificateur qui prend en charge l'exécution séquentielle du travail. En fin de compte, vous ne rencontrerez pas le problème du délai d'attente, et vous pouvez généralement dédier une machine entière à l'exécution de ces tâches afin que la mémoire ne soit pas un problème non plus.

Solution 2: Délégation des travailleurs

Je vais utiliser Gearman comme exemple pour cette solution, mais d'autres outils standards comme Encompass AMQP tels que RabbitMQ. Je préfère Gearman parce que c'est plus simple à mettre en place, et son plus conçu pour le traitement du travail sur la messagerie.

Ce type de délégation présente l'avantage de s'exécuter immédiatement après l'appel. Le serveur attend essentiellement des choses à faire (un peu comme un serveur Apache), quand il reçoit une requête, il déplace la charge de travail du client sur l'un de vos "workers", ce sont des scripts que vous écrivez et qui s'exécutent indéfiniment. serveur pour la charge de travail.

Vous pouvez avoir autant de ces travailleurs que vous le souhaitez, chacun exécutant le même ou différents types de tâches. Cela signifie que la mise à l'échelle est déterminée par le nombre de travailleurs que vous avez, et cela évolue horizontalement très proprement.

Conclusion:

Crons sont très bien à mon avis d'entretien automatisé, mais ils se jettent dans des problèmes quand ils ont besoin de travailler en même temps ce qui rend les travailleurs exécutant le choix idéal.

De toute façon, vous allez devoir changer la façon dont les utilisateurs reçoivent des commentaires sur leurs demandes. Ils auront besoin d'être informés que leur demande est en cours de traitement et de vérifier plus tard pour obtenir le résultat, alternativement vous pouvez suivre périodiquement l'état de la tâche en cours pour fournir un retour en temps réel à l'utilisateur via ajax. C'est un peu compliqué avec les tâches cron, car vous aurez besoin de maintenir l'état de la tâche pendant son exécution, mais Gearman a une bonne solution intégrée pour cela.

http://php.net/manual/en/book.gearman.php

+0

J'ai résolu avec job cron ... Thnk's – Edoardo