source: spip-zone/_plugins_/_test_/checklink/inc/checklink_verification.php @ 10014

Last change on this file since 10014 was 10014, checked in by cedric@…, 13 years ago

detection et import correct du charset

File size: 3.5 KB
Line 
1<?php
2
3function checklink_verifie_lien($url, $date_verif, $maj_statut){
4        include_spip('inc/distant');
5        $datas="";
6        $boundary="";
7        $url_abs = url_absolue($url);
8        if (!preg_match(",^([\w]{3-6})://,",$url_abs) AND $url_abs{0}!='/'){
9                $url_abs = suivre_lien(url_de_base(),$url_abs);
10        }
11        $statut = recuperer_page($url_abs, false, false, 1048576, $datas, $boundary, false, $date_verif);
12        // inchangee : on met juste a jour les infos
13        if ($statut==200){
14                spip_query("UPDATE spip_liens SET statut='oui',date_verif=NOW() WHERE url=".spip_abstract_quote($url));
15                spip_log("checklink : $url statut 200");
16                return;
17        }
18        // absente
19        if ($statut===false){
20                spip_query("UPDATE spip_liens SET statut='$maj_statut',date_verif=NOW() WHERE url=".spip_abstract_quote($url));
21                spip_log("checklink : $url introuvable, passage a $maj_statut");
22                return;
23        }
24        // presente
25        $texte = $statut;
26        // extraire le charset si present
27        $charset = false;
28        if (preg_match(",charset=\s*([^\s\"']*),i",$texte,$reg))
29                $charset = trim($reg[1]);
30        if ($charset)
31                $texte = charset2unicode($texte,$charset);
32        else {
33                // a l'aveugle
34                $texte = charset2unicode($texte,'iso-8859-1');
35                $texte = charset2unicode($texte,'utf-8');
36        }
37
38        // extraire le titre et la langue
39        $titre = null;
40        $lang = null;
41        if (preg_match(',<title[^>]*>(.*)</title>,Uims',$texte,$reg))
42                $titre = trim($reg[1]);
43        else if (preg_match(',<(h[1-6])[^>]*>.*</$1>,Uims',$texte,$reg))
44                $titre = trim($reg[2]);
45
46        if (preg_match(',<html[^>]*>,Uims',$texte,$reg))
47                $lang = extraire_attribut($reg[0],'lang');
48        if (!$lang){
49                // en depit on cherche un lang= quelque part ...
50                if (preg_match('/lang\s*=\s*[\'"]?([a-z\-]{2,5})/Uims',$texte,$reg))
51                        $lang=$reg[1];
52        }
53
54        spip_query("UPDATE spip_liens SET statut='oui',date_verif=NOW() WHERE url=".spip_abstract_quote($url));
55        if ($titre)
56                spip_query("UPDATE spip_liens SET titre=".spip_abstract_quote($titre)." WHERE url=".spip_abstract_quote($url)." AND titre_auto='oui'");
57        if ($lang)
58                spip_query("UPDATE spip_liens SET lang=".spip_abstract_quote(strtolower($lang))." WHERE url=".spip_abstract_quote($url)." AND lang_auto='oui'");
59        spip_log("checklink : $url mise a jour, passage a 'oui'");
60}
61
62
63function cron_checklink_verification($t){
64        // Initialisations
65
66        $url = "";
67
68        ## valeurs modifiables dans mes_options
69        ## attention il est tres mal vu de prendre une periode < 20 minutes
70        define('_PERIODE_VERIFICATION', 2*60);
71        define('_PERIODE_VERIFICATION_SUSPENDUE', 24*60);
72
73        // On va tenter un lien 'sus' ou 'off' de plus de 24h, et le passer en 'off'
74        // s'il echoue
75        $where = "statut IN ('sus','off')
76        AND date_verif < DATE_SUB(NOW(), INTERVAL
77        "._PERIODE_VERIFICATION_SUSPENDUE." MINUTE)";
78        $row = spip_fetch_array(spip_query("SELECT url,date_verif FROM spip_liens WHERE $where  ORDER BY date_verif LIMIT 1"));
79        if ($row)
80                checklink_verifie_lien($row["url"],$row["date_verif"], 'off');
81
82        // Et un lien 'ind' (ou 'oui' si plus de 'ind') de plus de 2 heures, qui passe en 'sus' s'il echoue
83        $where = "statut='ind'
84        AND date_verif < DATE_SUB(NOW(), INTERVAL "._PERIODE_VERIFICATION." MINUTE)";
85        $row = spip_fetch_array(spip_query("SELECT url FROM spip_liens WHERE $where     ORDER BY date_verif LIMIT 1"));
86        if (!$row){
87                $where = "statut='oui'
88        AND date_verif < DATE_SUB(NOW(), INTERVAL "._PERIODE_VERIFICATION." MINUTE)";
89                $row = spip_fetch_array(spip_query("SELECT url FROM spip_liens WHERE $where     ORDER BY date_verif LIMIT 1"));
90        }
91        if ($row)
92                checklink_verifie_lien($row["url"],$row["date_verif"], 'sus');
93
94        if ($url=="") return 1;
95       
96        spip_log("il reste des liens a verifier ...");
97        return (0 - $t);
98
99}
100?>
Note: See TracBrowser for help on using the repository browser.