ajax/nodejs versus file_get_contents ou curl

Eléphant du PHP | 101 Messages

23 janv. 2017, 15:01

Bonjour à tous,
J'ai une application qui fait actuellement un file_get_contents en PHP sur un énorme fichier json qui se trouve sur un serveur distant et affiche le résultat dans le navigateur . C'est hyper lent et utiliser curl a un peu amélioré la performance, sans pour autant donner de résultat acceptable.

J'ai donc envisagé d'utiliser un $.ajax en jquery pour charger le json mais je me heurte à l'erreur "Origin is not allowed by Access-Control-Allow-Origin" qui survient lorsque l'on fait des requêtes sur un serveur distant en javascript dans un navigateur.
La meilleure solution à ce problème est si possible d'ajouter un Access-Control-Allow-Origin: * dans le header de la page qui fournit le json. Mais c'est problématique dans mon cas car je ne contrôle pas le serveur distant.

La meilleure solution que je vois est d'utiliser node.js, mais je ne peux pas réécrire toute l'application. Je cherche donc la solution optimale avec les options dont je dispose, c'est à dire PHP et JQuery essentiellement.

Voici le scénario que j'envisage:
1- Mon application PHP lance un script jQuery $.ajax qui appelle une URL node.js sur le même serveur
2- Cette URL node.js fournit le contenu JSON après avoir contacté le serveur distant

Avantages:
- pas de Access-Control-Allow-Origin puisque c'est une application node.js qui fait la requête en arrière plan.
- node js est réputé performant

Inconvénient:
Ça fait beaucoup de requêtes pour un fichier JSON: l'utilisateur charge la page en PHP, puis Jquery Ajax vers url node.js locale, puis appel serveur distant depuis node.js, réception de la réponse => JQuery => Affichage.

Pour l'instant, je n'ai jamais créé d'appli en node.js mais j'ai étudié le language.
Je sais qu'avec le côté asynchrone de la requête jQuery Ajax et node.js + affichage progressif du HTML final, je peux donner l'impression à l'utilisateur qu'il n'a pas attendu trop longtemps.

Questions, sachant que c'est PHP qui charge la page au départ:
- Le gain de performance de node.js justifie tous les détours dans ce contexte?
- Y a-t-il une meilleure approche avec jQuery/Node.js ou autre librairie javascript pour faire un appel distant sur un énorme fichier JSON?

En vous remerciant par avance pour tout commentaire.

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7242 Messages

24 janv. 2017, 01:42

Bonjour,

Il faut d'abord que tu identifies précisément l'origine de la lenteur.
Car si c'est juste la récupération de ton énorme fichier JSON sur le serveur distant, que ce soit CURL, PHP ou Node.JS ça ne changera pas grand chose.

Un point d'attention à avoir également c'est la puissance du navigateur qui va devoir décoder ton énorme JSON. Pense à IE10 et aussi au navigateurs mobiles notamment sur des téléphones Android moyen-gamme qui risque de freezer pendant de longues minutes si ton JSON est trop gros.
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

24 janv. 2017, 15:20

salut,

le plus simple serait de voir si le service distant propose de paginer le résultat.
cela peux te permettre d'éviter un gros fichier qui va t'emmerder (emprunte mémoire, temps de calcul etc.).
De plus les gens ne regarde à la suite un flux de données énorme (tu te vois consulter une page avec 5000000 lignes d'une table ?).

pour l'entête il te suffit de l'ajouter. Après faut voir si le serveur réponds à une requête options (je ne sais pas pour jquery mais angular2 fait une requête options dans ce cas avant le requête qui va bien).

dernière solution utilise un cache local pour pouvoir paginer toi même me fichier. et de temps en temps (avec un cron par exemple) tu met à jour le fichier local en récupérant le fichier distant.
il faut voir si les données change beaucoup et l'important de la "fraîcheur" des données.

J'allais oublié, il y a la solution du "stream" et affichage au file de l'eau mais le json étant un fichier formaté de toute façon le navigateur va devoir attendre la fin de la requête pour le digérer.
C'est d'ailleurs le cas pour toutes les technos que tu va employer.

@+
Il en faut peu pour être heureux ......