Vu que je travaille au dépoussiérage de Magnyaa (
https://root.suumitsu.eu/wiki/doku.php?id=php:magnyaa --oui oui la version 2 sera sur Github, tout bien), et que l'extraction des métadonnées est maintenant entièrement côté serveur (simple_html_dom et torrent-rw, je vous aime), je me devais de tester le comportement du script en cas de panne du site.
Et là, problème: NyaaTorrents dans son ensemble subit un DDoS, qui affecte tous ses serveurs. Et les enregistrements DNS sont gérés par GLUE (ns1.nyaa.se et ns2.nyaa.se voir
https://fr.wikipedia.org/wiki/Domain_Name_System#Glue_records ), et que les serveurs d'autorité DNS sont les mêmes que serveurs web et tracker...
En travaillant en PHP, vous connaissez peut-être les stream context, qui permettent de définir un timeout de connexion notamment, et pareil avec cURL (CURLOPT_CONNECTTIMEOUT). Souci: tout ceci ne concerne que la phase de connexion: la phase de résolution de noms est exclue, et il faut bien 18 secondes pour que les serveurs DNS répondent !!
Une solution possible: utiliser WGET du shell, vu qu'il a une option --dns-timeout très utile. Côté PHP: shell_exec("wget --dns-timeout 3 -q -O - $url/?$req");
L'autre solution, si l'on veut pas dépendre du shell: hardcoder la résolution DNS ! cURL permet cela. Voici ce que je fais: curl_setopt($c, CURLOPT_RESOLVE, array("sukebei.nyaa.se:80:188.95.48.66","www.nyaa.se:80:188.95.48.66"));
Et là on peut tranquillement mettre le timeout de connexion: curl_setopt($c, CURLOPT_CONNECTTIMEOUT ,3);
Et voilà ! Le script PHP mouline moins de 4 secondes avant de renvoyer l'erreur de connexion :)
(merci à Oros au passage, dont j'ai piqué la fonction cURL de BooruMirror)
(
Permalink)