10
votes

Graphique Facebook extrêmement lent dans php

Si vous utilisez le Facebook PHP SDK ou simplement charger des données à l'aide de CURL avec $ Contenu = file_get_contents ("https://graph.facebook.com/ArdeD?Access_Tokokook.com/AccessToken") , Il faut environ une seconde entière pour la réponse à venir.

qui compte aussi lentement lorsque j'ai besoin de vérifier les données pour un tas d'identifiants.

Lorsque dans un navigateur, si je tapez dans une URL de graphique Facebook, je reçois les résultats presque instantanément, sous une dixième du temps nécessaire à PHP.

Qu'est-ce qui cause ce problème et comment puis-je le rendre aussi rapide que dans n'importe quel navigateur? Je sais que le navigateur peut le faire. Il doit y avoir un moyen de le rendre rapide dans PHP.

idée: peut-être que j'ai besoin de configurer quelque chose dans Curl?

Qu'est-ce que j'ai essayé:

  • en utilisant le SDK PHP. C'est aussi lent. La raison pour laquelle j'ai essayé d'utiliser file_get_contents () en premier lieu parce que j'espérais que le PHP SDK n'a pas été configuré correctement.
  • en utilisant setopt ($ ch, curlopt_ssl_verifypeer, false); . Cela n'a pas fait une différence. Après la réponse, acceptez EDIT: En réalité, ceci avec la réutilisation de la poignée de courbure rendit les demandes suivantes vraiment rapides.

    Edit: Voici une pâte du code que j'ai utilisé pour mesurer le temps nécessaire pour faire les demandes: http: / /pastebin.com/bebuqq5g . J'ai corrigé le texte qui disait des microsecondes, aux secondes. C'est ce qui produit des résultats similaires à ceux que j'ai écrites dans mon commentaire dans cette question: Facebook graphique extrêmement lent dans php . Notez également qu'ils prennent des moments de même lents, même si le jeton d'accès est expiré, comme dans mon exemple de Pastebin.

    EDIT 2: Il devrait y avoir un problème en partie avec SSL. J'ai essayé Benchmarking http://graph.facebook.com/4 (non https), et il a résulté. En 1,2 secondes pour trois demandes, alors que la même chose, mais avec HTTPS a pris 2,2 secondes. Ce n'est en aucun cas une solution, car pour toute demande nécessitant un jeton d'accès, je dois utiliser HTTPS.


7 commentaires

PHP doit aller chercher et traiter. Mais lorsque vous utilisez la demande du navigateur, vous dirigez directement sur Facebook Server, ce qui le rend beaucoup plus rapide :-).


Que veux-tu dire? Ne file_get_contents () avec une URL Facebook Go to Facebook directement? Et sinon, comment faire je le fais aller directement sur Facebook?


Je parlais de la différence que vous comparais avec file_get_contents et votre navigateur. Pour le script PHP, il a d'abord besoin d'analyser ce genre de choses et d'obtenir le contenu et de vous redonner. D'autre part, il suffit de l'envoyer sur une mouche.


Je ne comprends toujours pas. Qu'est-ce que php analyse du navigateur?


Essayez un appel JavaScript au lieu de PHP, j'espère que cela fonctionne mieux aussi que vous pouvez obtenir tous les identifiants dans un seul appel, voir la demande de lot Facebook


Il signifie que dans la demande de navigation se passe comme A -> B -> A, où a est le navigateur et avec votre script PHP c'est A -> B -> C -> B -> A


Avez-vous essayé de demander le graphique sur le même serveur que votre PHP fonctionne directement avec CURL ou WGET? Quelle est la vitesse là-bas? Le problème avec la vitesse de votre navigateur est HTTP Keep-vivant et des problèmes de mise en cache DNS d'autres personnes ont déjà mentionné ici.


5 Réponses :


8
votes

file_get_contents peut être très lent dans PHP car il ne peut pas envoyer / traiter les en-têtes correctement, ce qui entraîne la connexion HTTP ne se referme pas correctement lorsque le transfert de fichier est terminé. J'ai également lu sur les problèmes DNS, bien que je n'ai aucune information à ce sujet.

La solution que je recommande vivement est d'utiliser le SDK PHP, conçu pour la création d'appels d'API sur Facebook ou utiliser Curl (que le SDK utilise). Avec CURL, vous pouvez vraiment configurer de nombreux aspects de la demande, car il est essentiellement conçu pour faire des appels d'API comme celui-ci.

PHP SDK Information: https://Developers.facebook.com/docs/reference/php/

PHP SDK Source: https://github.com/facebook/facebook-php-sdk

Si vous Choisissez de le faire sans le SDK, vous pouvez regarder comment ils utilisent courbure dans base_facebook.php . Voici quelques échantillons de code que vous pouvez utiliser pour récupérer à l'aide de CURL: xxx

La fonction reviendra false sur l'échec.

Je vois que vous avez dit que vous avez dit J'ai utilisé le SDK PHP, mais peut-être que vous n'aviez pas de boucle configurée. Essayez Installation ou mise à jour IT, et s'il semble toujours être lent, Vous devez utiliser xxx

et vérifier la sortie.


9 commentaires

Malheureusement, le SDK Facebook a été la première chose que j'ai utilisée. J'ai délibérément posté mon problème dans le format de file_get_contents () pour montrer que même sans la surcharge du SDK Facebook, les demandes prennent toujours une période anormalement longue. file_get_contents () n'est ni plus rapide ni plus lent que d'utiliser le SDK PHP.


J'ai également testé votre code et ce n'était pas assez rapide. Temps verbeux (un code de courbure que j'ai trouvé quelque part): 2.5703480243683 Microsecondes. Fichier Obtenir le contenu du contenu: 3.0643820762634 Microsecondes. Andrewf Time: 2.3033740520477 Microsecondes.


@ SZÉMIATTILA Comment testez-vous ces temps?


Désolé, j'étais pressé, je ne pouvais donc pas vérifier ce que j'ai écrit. Les temps que j'ai postés sont en secondes, pas de microsecondes, comme je l'ai écrit, ce qui est mon erreur. Je n'ai pas non plus écrit que ces temps sont pour des boucles de 3 de la même demande par type de connexion, de sorte que vous les diviseriez par 3 pour obtenir une perspicacité plus réaliste de la vitesse, de sorte qu'elles prennent environ 0,7 1 seconde chacune . Et voici une pastebin de la demande de courroie d'Andrewf: Pastebin.com/nh9yy73T


@ SZÉMIATTILA OK, quelle commande utilisez-vous pour tester ces temps. Si vous l'appelez trois fois, comment remplissez-vous une référence à la demande du navigateur?


Oh je suis désolé ... $ start = microtime (vrai); echo microtime (vrai) - $ départ; ; Je fixe correctement l'heure de début de chacun avant leur test, avant la boucle.


Ne faites-vous que cette requête avec la même chose que vous utilisez à chaque fois? Essayez un autre utilisateur, comme 4. Aussi, que se passe-t-il lorsque vous essayez un appel d'API non sécurisé avec un accès public tel que graphique. Facebook.com/4 ?


Oh, je n'ai pas remarqué ce commentaire de la vôtre hier. J'ai modifié mon poste, y compris votre expérience.


Ah je n'ai pas vu comment vous avez mentionné l'analyse comparative du navigateur. Il semble que la preuve est contre moi, car le point de repère JavaScript montre que les temps sont à peu près les mêmes (aussi, trois demandes): 2.940999984741211 de sorte que cela nettoie JavaScript ... mais lorsque je tape dans une fenêtre de navigateur, il semble toujours si vite. .. Essayez-le et voyez ce que je veux dire. Je me sens comme si je peux spamner facilement. Est-ce juste une illusion?



1
votes

Le facteur général global dans la fabrication d'appels d'API graphiques "SLOW" est - la connexion HTTP.

Peut-être qu'il y a une amélioration Little en modifiant certains paramètres ou d'obtenir un serveur avec une meilleure connexion.

Mais cela ne fera probablement pas la différence gros , car HTTP doit généralement être considéré comme "lent", et il y a peu de choses qui peuvent être faites à ce sujet.

qui compte aussi lentement lorsque j'ai besoin de vérifier les données pour un tas d'identifiants.

La meilleure chose à faire pour accélérer les choses est, bien sûr - minimiser le nombre de demandes HTTP.

Si vous devez effectuer plusieurs appels d'API graphique d'affilée, essayez de les faire en tant que Demande de lot à la place. Cela vous permet d'interroger plusieurs parties de données, tout en faisant uniquement la une requête HTTP .


1 commentaires

Mais comme je l'ai dit, lorsque vous le faites dans le navigateur, c'est beaucoup plus rapide et qui utilise HTTP. Je voudrais atteindre la vitesse au moins aussi vite que le navigateur. Il peut y avoir quelque chose avec les frais généraux de la partie SSL. Je vais modifier mon premier post.



7
votes

Je me suis demandé ce qui se passerait si j'ai fait deux appels ultérieurs CURL_EXEC () sans faire un curl_close () , activant l'utilisation de HTTP Keep-Vive.

Le code de test: xxx

ci-dessous est les résultats, affichant des parties de la sortie de curl_getinfo () : xxx

La première demande est assez lente, presque une Entier secondaire, semblable à votre expérience. Mais à partir du moment de la deuxième demande (seulement 0,25s), vous pouvez voir la quantité de différence que la conservation réalisée.

Votre navigateur utilise également cette technique, chargement de la page dans une nouvelle instance de Votre navigateur prendrait considérablement plus longtemps.


8 commentaires

Ok, voici une pastebin de moi en cours d'exécution curl_getinfo ($ ch) : Pastebin.com/tg48uRre < / a> (une des demandes de la première exemple de curl est le premier print_r, et l'une des demandes de courbure de l'Andrewf est la deuxième)


@ Szermiattila merci, a mis à jour ma réponse; BTW, vous ne devriez pas fuir votre propre jeton d'accès dans la pâte; p


Oui, oui, peu importe, ça va sortir quand même. Mais de toute façon, la modification de votre réponse n'aide toujours pas, car comme je l'ai déjà mentionné, en tapant graph.facebook.com ... dans le navigateur directement, cela devrait également être la même priorité faible, car tout ira de mon adresse IP et de tout, mais il est toujours beaucoup plus rapide dans le navigateur. J'aimerais savoir pourquoi et ce que je peux faire pour que la courbe soit aussi rapide que si j'écris l'URL graphique dans le navigateur.


@ Szermiattila Vous êtes à droite, je ne pensais pas ... Mais je suis heureux de signaler que j'ai découvert la différence :) Réponse mise à jour.


Donc, ce que cela signifie que je pourrais réécrire le SDK PHP Facebook afin qu'il puisse essayer de réutiliser une seule ressource CURL lors de la mise en page des données, au lieu de la connexion et de la fermeture par demande, puis les demandes doivent être plus rapides?


@ Szermiattila droite, ce serait exactement ma recommandation :) Le SDK n'est-il pas déjà cela si CURL est disponible?


Le SDK Facebook semble avoir cette fonctionnalité à mi-chemin de mise en œuvre, car la méthode MakeRequest () accepte une poignée de courbure éventuellement pour la réutilisation, mais la seule méthode qui appelle cette méthode protégée est _oauthrequest () < / code>, et cela ne passe jamais une poignée de boucle. Cette solution de réutilisation fonctionnera si même si je demande différentes chemins sur graph.facebook.com , ne sera pas ce?


@ Szermiattila ouais, ça devrait. Il ne se déconnectera que lorsque vous changez d'hôtes :)



2
votes

Juste deux pensées:

  1. Avez-vous vérifié que le navigateur n'a pas de connexion prérefonte à Facebook? Que le navigateur n'a pas mis en cache la recherche DNS (vous pouvez essayer d'ajouter Graph.facebook.net à votre fichier d'hôtes pour régner dans / OUT DNS)

  2. Vous avez bien sûr exécuté le code PHP du même système / environnement que votre navigateur (pas d'un VM, pas d'un autre hôte? De plus, PHP fonctionne avec les mêmes priorties de planification que votre navigateur? (Idende Nice Niveau, etc.))


1 commentaires

Une étape suivante possible serait de faire une capture de paquets et de regarder le flux là-bas - pour avoir une meilleure idée du chronométrage (navigateur VS PHP).



0
votes

Ceci est purement une spéculation, mais la cause peut être que Facebook utilise le protocole SPDY (pas sûr de savoir si cela est vrai pour l'API). PHP n'est pas capable de charger la page à l'aide du protocole SPDY.


0 commentaires