2009-06-24 10 views
2

J'essaie de vérifier si un site Web est opérationnel. Je le fais actuellement avec la librairie UserAgent en Perl avec le timeout 1. Cependant, c'est encore trop lent pour moi. J'appelle le script toutes les cinq minutes à partir de cron. Il y a beaucoup de liens à vérifier et le script prend plus de cinq minutes pour terminer l'exécution. Donc, j'ai besoin d'un moyen plus efficace de le faire. Il peut même être une solution en C.Quel est le moyen le plus rapide de vérifier si un site web est en Perl ou C?

Répondre

9

Après les moyens d'accélérer ce:

  1. juste vérifier si nous pouvons mettre en place une prise à 80 port du serveur cible, n'envoyez pas vraiment Get http demande, ou tout simplement envoyer une simple demande HEAD.
  2. Utilisez multi-thread pour le rendre plus rapide.
+0

Serait-ce couvrir toutes les bases souhaitées? Que faire s'il y a une erreur de serveur sur la page principale ou quelque chose? –

+1

Going multi thread, bien que cela semble agréable, est inutile overkill. Habituellement, l'utilisation d'E/S asynchrones est suffisante. –

4

boucle -I http://hostname

La première ligne contiendra 503 ou 404 si le service ne avaliable ou page non trouvée.

rendements de temps pour cette boucle -I http://www.google.com

real 0m0.125s 
user 0m0.004s 
sys  0m0.004s 

et ce pour boucle -I http://www.google.cmo

real 0m0.120s 
user 0m0.004s 
sys 0m0.004s 
+0

En fait, j'ai essayé avec wget il travaillé très rapide pour les sites web existants mais a dû attendre les liens brisés. Mais je vais essayer la boucle aussi. – systemsfault

4

S'il y a beaucoup de liens, je vous suggère de rendre le programme multi-threaded ou fork() il parfois. De cette façon, vous pouvez vous attendre à des améliorations de vitesse.

+0

Malheureusement, mon perl n'est pas compilé avec multi-thread, mais je vais vérifier l'option multi-processus – systemsfault

+2

Vous pouvez utiliser des threads même sans avoir un thread perl. 'use forks;' - http://search.cpan.org/perldoc?forks –

+0

Oh ok, cette connaissance vous aidera aussi pour d'autres choses. Thanx Alan. Mais cela fonctionnera-t-il en écrivant dans un fichier? – systemsfault

3

L'extraction de ressources à partir du réseau implique généralement un certain temps de latence. Comme Alan Haggai Alavi l'a suggéré, vous voudrez probablement diviser le travail en plusieurs processus/processus parallèles. La documentation du module Parallel::ForkManager a même un exemple sur lequel vous devriez pouvoir vous baser.

+0

Parallel :: ForkManager est sympa. –

+0

Ouais hillu, mais je pense que je ne peux pas utiliser l'option de parallélisation parce que je vérifie si un site Web est en place écrire l'URL d'un fichier png spécifique dans un fichier. Donc, si je paralléliser le programme ne sera pas un problème lors de l'écriture dans un fichier? – systemsfault

+0

Comme je comprends la suggestion de hillu, vous devriez avoir plusieurs processus/threads, mais un site devrait être surveillé par un processus (au maximum). Il ne devrait donc pas y avoir de conflits entre les processus. –

8

Il est très probablement lent parce que vous le faites de manière séquentielle.

Envisagez d'utiliser LWP::Parallel::UserAgent - il exécutera de nombreuses demandes en même temps.

0

Je ne sais pas beaucoup de C (BLASPHÈME!) Ni Perl, mais comment je le vois, je les opérations suivantes:

  • Un thread pour l'écriture de fichiers. Ce fil aurait un endroit où il pourrait écrire ses commandes.
  • Un fil par site que vous voulez vérifier. Le thread utilisera la méthode qui vous convient le mieux parmi les autres réponses, puis rapportera au thread principal via un événement qu'il peut déclencher.

2cts

Questions connexes