Liens morts ...

15 réponses
AuteurMessage

flush |
Modérateur

Photo de flush

Inscrit le : 09/05/2005

# Le 06/07/2006 à 13:53

J'ai une base de donnée avec des milliers de liens, et je voudrais lancer une tâche cron de temps en temps pour vérifier si il y a des liens morts ... (au bout de x temps que le lien est mort je supprime ce lien)

Avez vous déjà procédez a ceci ? vous avez des pites pour un tel test ?

Script php ?
Script shell ? (wget / telnet ?)

J'ai envie de partir sur du php + shell avec telnet ... vous en pensez quoi ?

A moins que vous connaissez un truc tout fait ?

@+ Jean-Philippe

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 06/07/2006 à 15:01

perso ce serait à coup de PHP + sockets non bloquant, pour pouvoir en ouvrir des centaines en parallèle... et coté HTTP, une simple requête HEAD suffirait, pas besoin de plus.

Par contre face aux redirections en cas d'erreur, en guise de 404, rien à faire...

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

flush | Jean-Philippe
Modérateur

Photo de flush

Inscrit le : 09/05/2005

# Le 06/07/2006 à 15:28

Avec un telnet (avec un HEAD biensûr ;))
j'ai le retour ... 200 ou 301/302 ou 404 etc...

Avec les sockets en php on doit aussi pouvoir récupérer les codes de retour je pense ... je vais voir ca je posterai ma solution ;)

@+ Jean-Philippe

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 06/07/2006 à 16:18

Ce que je voulais dire c'est que certains envoyent une redirection "normale" ou meme une page normale (code 200) au lieu d'une erreur 404. Dans ce cas là, difficile de détecter l'erreur...

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

flush | Jean-Philippe
Modérateur

Photo de flush

Inscrit le : 09/05/2005

# Le 06/07/2006 à 18:33

Bool a dit :
Ce que je voulais dire c'est que certains envoyent une redirection "normale" ou meme une page normale (code 200) au lieu d'une erreur 404. Dans ce cas là, difficile de détecter l'erreur...


C'est sur ... enfin déjà le lien est pas complètement mort ! Ca arrive quelque part ! Bon je m'y met de suite ;) (j'ai vu un exemple sur php.net qui colle à 80% a ce que je veux !!)

@+ Jean-Philippe

zehub | BENAICHA
Membre

Photo de zehub

Inscrit le : 21/12/2005

# Le 06/07/2006 à 22:30

ou alors ya la solution .... pas cron mais "con" .... tester tous les liens un par un !!!

DivertissementOuvrir dans une nouvelle fenetre , VoyagesOuvrir dans une nouvelle fenetre , VoituresOuvrir dans une nouvelle fenetre , CuisineOuvrir dans une nouvelle fenetre

flush | Jean-Philippe
Modérateur

Photo de flush

Inscrit le : 09/05/2005

# Le 06/07/2006 à 23:55

Voilà une solution un peu crade mais qui marche :
Je sais pas si les sockets sont bloquand ou non, j'ai pas regarder le code déjà trouvé sur la doc mais ca va très vite ;)


define('HTTP_OK', 200);

/*
* Retourne 0 si la connexion à l'hôte est impossible
* Sinon retourne le code d'erreur sous forme d'un integer
*/
function testLink($url)
{
$domain = substr($url, strpos($url,'://')+3);
$page = substr($domain, strpos($domain,'/'));
$domain = substr($domain, 0, strpos($domain,'/'));

/* Get the port for the WWW service. */
$service_port = getservbyname('www', 'tcp');

/* Get the IP address for the target host. */
$address = gethostbyname($domain);

/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if ($socket < 0) {
//echo "socket_create() failed: reason: " . socket_strerror($socket ) . "\n";
return 0;
}

$return="";

$result=-1;
$result = @socket_connect($socket, $address, $service_port);
if ($result==null || $result < 0) {
return 0;
}
else
{
$in = "HEAD ".$page." HTTP/1.1\r\n";
$in .= "Host: ".$domain."\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';
$sout='';
socket_write($socket, $in, strlen($in));

while ($out = socket_read($socket, 2048))
$sout.= $out;

$sout=trim($sout);
$return = substr($sout, strpos($sout, ' '));
$return = trim($return);
$return = substr($return, 0, strpos($return, ' '));
}

socket_close($socket);

return (int)trim($return);
}

@+ Jean-Philippe

superfc | Florent
Membre

Photo de superfc

Inscrit le : 01/07/2006

# Le 07/07/2006 à 00:48

Par rapport au mode de traitement, uu prends des paquets de 100 adresses non rafraîchies depuis plus de 1 an par exemple. Et tu marques leur date de rafraîchissement.

En ce qui concerne la connexion : Si t'as besoin de traiter un grand nombre d'adresses, t'as plus intérêt à le programmer en C, en utilisant des librairies de communication HTTP. C'est un peu plus chiant à programmer mais le temps d'execution est incomparable. A mon avis, tu peux facilement avoisiner les 50 requêtes / seconde (avec genre 10 à 20 sockets concurrents) sur un serveur avec une bonne connexion, ce que tu ne pourras jamais faire en PHP.
Même pas besoin de connaissances de thread, juste du C.

Disons que comme ça a des chances d'être 1000x plus rapide, tu peux y gagner pas mal. Pourvu que ça ai un réel intérêt...

Florent

Florent Clairambault - http://florent.clairambault.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

flush | Jean-Philippe
Modérateur

Photo de flush

Inscrit le : 09/05/2005

# Le 07/07/2006 à 08:03

Ouais, je me suis taté de le faire en c ou cpp avec qt que je connais bien, mais bon maintenant que c'est fait !!! Ca va tourner la nuit sur le serveur et que ca mette 1heure ou 3 ... pas grande importance !

@+ Jean-Philippe

MathieuC | Mathieu
Modérateur

Photo de MathieuC

Inscrit le : 15/07/2005

# Le 07/07/2006 à 09:37

[HS] C'est vraiment lourd ce bug CSS qui fait que quand une quote depasse la largeur du forum, toute la partie de droite soit tronquee...

Ca me le fait avec IE 6 sous XP SP2, la config la plus standard qui soit quoi

erwinol | Erwin
Membre

Photo de erwinol

Inscrit le : 09/05/2005

# Le 07/07/2006 à 10:59

Telaxo a dit :
[HS] C'est vraiment lourd ce bug CSS qui fait que quand une quote depasse la largeur du forum, toute la partie de droite soit tronquee...

Ca me le fait avec IE 6 sous XP SP2, la config la plus standard qui soit quoi


Sous Firefox, pas de souci.
Je suis allé voir ce que ça donne sous IE et effectivement c'est pas top. En plus l'auteur du message n'a pas accès au bouton pour éditer son message donc il est destiné à rester comme ça

Telaxo : Ferme ton tag HS sinon ça va dégénérer ici...

(Message édité le 07-07-2006 à 11h20 par erwinol)

superfc | Florent
Membre

Photo de superfc

Inscrit le : 01/07/2006

# Le 07/07/2006 à 11:32

Bah, tout le monde va passer sous IE 7 d'ici peu. Ca devrait disparaître. Il doit bien y avoir quelqu'un qui l'a pour confirmer, non ?

(Message édité le 07-07-2006 à 11h38 par superfc)

Florent Clairambault - http://florent.clairambault.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

mirage | Vincent
Modérateur

Photo de mirage

Inscrit le : 04/05/2005

# Le 07/07/2006 à 11:42

Non, le rendu sous IE7 est aussi très mauvais (il n'y a que Firefox qui le gère bien)

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 07/07/2006 à 14:01

superfc a dit : [...] A mon avis, tu peux facilement avoisiner les 50 requêtes / seconde (avec genre 10 à 20 sockets concurrents) sur un serveur avec une bonne connexion, ce que tu ne pourras jamais faire en PHP. [...]


Pour moi ce qui est lent c'est la réponse des différents serveurs, pas le petit soft qui tourne en local. Et contre ça, tu pourras même coder en assembleur que cela ne changera rien : c'est de l'autre coté du tuyau que ça coince. De plus si tu mets à jour une base de données derrière, si jamais il y a une limitation en local, ça risque d'être de ce coté.
Le seul "remède" que tous les algos du genre utilisent : parallèliser les transferts.

Donc pour moi pas besoin de sortir l'artillerie lourde, un bête langage de script suffira emplement (d'autant plus que toute la couche socket est compilée, de toutes façons). Non ?

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

flush | Jean-Philippe
Modérateur

Photo de flush

Inscrit le : 09/05/2005

# Le 07/07/2006 à 14:56

> surement ^^ Je pense pas perdre beaucoup de temps avec php !
J'aurais perdu plus de temps à écrire la chose en C (lié avec la base de donnée et companie ...)
Que les quelques microsecondes que je peux perdre sur chaque interrogation !

@+ Jean-Philippe

superfc | Florent
Membre

Photo de superfc

Inscrit le : 01/07/2006

# Le 08/07/2006 à 16:42


Donc pour moi pas besoin de sortir l'artillerie lourde, un bête langage de script suffira emplement (d'autant plus que toute la couche socket est compilée, de toutes façons). Non ?


En C, tu réduis de beaucoup les latences. Et de façon générale, le traitement PHP est long. Et particulièrement sur des utilisations simple (bah oui, les fonctions PHP natives et "complexes" sont, elles, executées) alors qu'en PHP chaque instruction induit un retard du à l'interprétation. Et c'est donc justement sur des petites tâches répétitives que le PHP est lent.

La couche socket est compilée ok mais tous les petits traitements du script derrière ralentissent pas mal.

Autre chose, plutôt que de le faire tourner la nuit, tu peux très bien choisir de le faire tourner (en nice level 20) tant que ta charge est inférieur à 1 (nous on fait ça pour les stats, et ça marche vraiment bien). Comme ça, tu optimises bien ton serveur sans le crever pour autant.

Et là encore, avec un programme en C, ta charge va pas du tout bouger, alors qu'en PHP y'a de fortes chances que si.

Mais sinon, dans le principe, tu as carrément raison. Pour ma part, je ne code rien du tout en C non plus. Mais si j'avais les même besoins que toi, je pense que je le ferais.

D'autre part, MySQL n'est franchement pas un goulot d'étranglement pour les programmes en C. La librairie libmysql est très rapide.

Florent

(Message édité le 08-07-2006 à 16h50 par superfc)

Florent Clairambault - http://florent.clairambault.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 24/11/2024 9:39:15 | Généré en 14.68ms | Contacts | Mentions légales |