PHP / Curl: TÊTE de Demande prend du temps sur certains sites
J'ai un code simple qui fait une tête de requête d'URL et puis imprime les en-têtes de réponse. J'ai remarqué que sur certains sites, cela peut prendre un certain temps pour terminer.
Par exemple, en demandant http://www.arstechnica.com
prend environ deux minutes. J'ai essayé la même demande à l'aide d'un autre site web qui fait la même tâche de base, et il vient de revenir immédiatement. Donc il doit y avoir quelque chose que j'ai mal réglé qui est à l'origine de ce retard.
Voici le code que j'ai:
$ch = curl_init();
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt ($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
//Only calling the head
curl_setopt($ch, CURLOPT_HEADER, true); //header will be at output
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); //HTTP request is 'HEAD'
$content = curl_exec ($ch);
curl_close ($ch);
Voici un lien vers le site web qui fait la même fonction: http://www.seoconsultants.com/tools/headers.asp
Le code ci-dessus, au moins sur mon serveur, prend deux minutes pour récupérer www.arstechnica.com mais le service sur le lien ci-dessus renvoie tout de suite.
Ce qui me manque?
- ce que curl est manquant est un corps de réponse, il ne sait pas que la TÊTE de demandes de retourner uniquement les en-têtes (pas de corps), il est donc en attente sur le serveur pour envoyer plus de données. donc curl attend 2 minutes, puis abandonne.
Vous devez vous connecter pour publier un commentaire.
Essayez de simplifier un peu:
Ci-dessus sorties instantanément sur mon serveur. Si ce n'est pas sur le vôtre, il ya une bonne chance que votre hébergeur a une sorte de mise en place pour limiter ce genre de demandes.
MODIFIER:
Depuis le ci-dessus se produit instantanément, pour vous, essayez de définir ce paramètre de roulage sur votre code d'origine:
À l'aide de l'outil que vous avez posté, j'ai remarqué que
http://www.arstechnica.com
a une 301-tête envoyé pour toute demande envoyée. Il est possible que cURL est arriver et ne pas en suivant le nouvel Emplacement spécifié, par conséquent, à l'origine de votre script à accrocher.DEUXIÈME ÉDITION:
Curieusement, en essayant le même code que vous avez ci-dessus a été prise de mon serveur accrocher trop. J'ai remplacé ce code:
Avec ceci:
Qui est la façon le manuel vous recommande de faire une TÊTE de demande. Il fait le travail instantanément.
Vous devez vous rappeler que la TÊTE n'est qu'une suggestion pour le serveur web. Pour la TÊTE pour faire la bonne chose, il faut souvent attendre quelques efforts explicites de la part des admins. Si vous vous dirigez d'un fichier statique Apache (ou quel que soit votre serveur web est) souvent l'étape dans une faire la bonne chose. Si vous vous dirigez une page dynamique, la valeur par défaut pour la plupart des configurations, est la réalisation d'OBTENIR le chemin, recueillir tous les résultats, et juste envoyer les en-têtes sans que le contenu. Si cette demande est de 3 (ou plus) niveau d'installation, cet appel pourrait être très coûteux et inutile pour une TÊTE de contexte. Par exemple, sur un servlet Java, par défaut doHead() appelle juste doGet(). Pour faire quelque chose d'un peu plus intelligent pour l'application, le développeur devra implémenter explicitement doHead() (et le plus souvent, ils ne le seront pas).
J'ai rencontré une application à partir d'une fortune de 100 société qui est utilisé pour le téléchargement de plusieurs centaines de méga-octets d'information sur les prix. Nous aimerions vérifier les mises à jour que les données en exécutant les requêtes HEAD assez régulièrement jusqu'à ce que la modification de la date a changé. Il s'avère que cette demande serait effectivement faire revenir mettre fin à des appels à générer cette liste à chaque fois, nous avons fait la demande à laquelle participent des gigaoctets de données sur leur back-end et xfer entre plusieurs serveurs internes. Ils n'étaient pas très heureux avec nous, mais une fois que l'on nous explique les cas d'utilisation, ils sont rapidement venu avec une solution alternative. Si ils avaient mis en œuvre à la TÊTE, plutôt que de compter sur leur serveur web pour de faux, il n'aurait pas été un problème.
Si ma mémoire ne me manque de faire une requête HEAD en CURL, les changements de la version du protocole HTTP 1.0 (qui est lente et probablement le coupable partie ici), essayez de modifier que:
J'ai utilisé le dessous de la fonction pour trouver l'URL redirigée.
Le second argument fait il retourne un tableau avec les clés. Par exemple, ci-dessous donnent la
Location
valeur.http://php.net/manual/en/function.get-headers.php
Ce:
Je ne cherche pas à récupérer les en-têtes.
J'essayais juste de faire de la page de chargement de certaines données de ne pas prendre plus de 2 minutes similaire est décrit ci-dessus.
Que magique, peu d'options a chuté à 2 secondes.