Changeset 92093 in spip-zone


Ignore:
Timestamp:
Sep 29, 2015, 12:35:53 PM (4 years ago)
Author:
kent1@…
Message:

Revoir la liste des tables et champs parcourus

On prend toutes les tables dites "principale" sauf spip_syndic_articles (ça mériterait un pipeline ici)

On prend tous les champs de type texte (tinytext, longtext, mediumtext, text)

Utiliser sql_allfetsel + foreach au lieu de sql_select + sql_fetch (moins lourd)

Pour les statuts inconnus des liens internes => malade au pire

Location:
_plugins_/linkcheck/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/linkcheck/trunk/action/linkcheck_parcours.php

    r92068 r92093  
    2121
    2222        if(autoriser('webmestre')){
    23        
    2423                //si la fonction n'a pas encore été effectué completement | Dans le cas ou on ne peux effectuer cette action qu'une fois ...
    2524                //if(!lire_config('linkcheck_etat_parcours')){
     
    2928                        $do = lire_config('linkcheck_dernier_objet');
    3029                        $etat = lire_config('linkcheck_etat_parcours');
    31                        
    3230                       
    3331                        //si le parcours a déja été réalisé, on reinitialise les méta
     
    4240                                //si on en est bien a cette table
    4341                                if(($do && $do<$key_table) || !$do){
    44                                        
    45                                         $nom_champ_id=id_table_objet($table);
    46                                         $table_sql=table_objet_sql($table);
    47                                        
    48                                         // Récuperer la liste des champs suivant le type d'objet
    49                                         $tab_champs_a_traiter = linkcheck_champs_a_traiter($nom_table);
    50                                         $trouver_table = charger_fonction('trouver_table','base');
    51                                         $desc = $trouver_table($table_sql);
    52                                         $tab_champs_a_traiter = array_intersect_key($tab_champs_a_traiter,$desc['field']);
    53                                         if(empty($tab_champs_a_traiter))
    54                                                 break;
    55                                         $champs_a_traiter=is_array($tab_champs_a_traiter)?implode(',',array_keys($tab_champs_a_traiter)):'*';
    56                                        
    57                                         // Recommencer à l'endroit ou l'on s'est arrêté
    58                                         $where  = $nom_champ_id.">".intval($dio);
    59                                        
    60                                         // Ne sélectionner que les objets dans la base qui contiennent des URLs
    61                                         // @todo Tester pour oracle et sqlite
    62                                         if($db_ok['type']==='mysql'){
     42                                        foreach($table as $table_sql => $info_table){
     43                                                $nom_champ_id=id_table_objet($table_sql);
     44                                                // Récuperer la liste des champs suivant le type d'objet
     45                                                $tab_champs_a_traiter = linkcheck_champs_a_traiter($info_table);
     46                                                if(empty($tab_champs_a_traiter))
     47                                                        break;
     48                                                $champs_a_traiter=is_array($tab_champs_a_traiter)?implode(',',array_keys($tab_champs_a_traiter)):'*';
     49
     50                                                // Recommencer à l'endroit ou l'on s'est arrêté
     51                                                $where  = $nom_champ_id.">".intval($dio);
    6352                                               
    64                                                
    65                                                 $tab_expreg_mysql = array(
    66                                                         '(((https?|ftps?)://)|(((https?|ftps?)://)?[A-Za-z0-9\-]*\.))[A-Za-z0-9\-]+\.[a-zA-Z]{2,4}/?',
    67                                                         '->[^\]]\]'     );
    68 
    69                                                 $where_reg = array();
    70                                                 foreach ($tab_champs_a_traiter as $nom_champs=>$type_champs){
    71                                                         if ($type_champs){
     53                                                // Ne sélectionner que les objets dans la base qui contiennent des URLs
     54                                                // @todo Tester pour oracle et sqlite
     55                                                if($db_ok['type']==='mysql'){
     56                                                        $tab_expreg_mysql = array(
     57                                                                '(((https?|ftps?)://)|(((https?|ftps?)://)?[A-Za-z0-9\-]*\.))[A-Za-z0-9\-]+\.[a-zA-Z]{2,4}/?',
     58                                                                '->[^\]]\]'     );
     59       
     60                                                        $where_reg = array();
     61                                                        foreach ($tab_champs_a_traiter as $nom_champs=>$type_champs){
     62                                                                if ($type_champs){
    7263                                                                        foreach ($tab_expreg_mysql as $expreg)
    7364                                                                                $where_reg[] = $nom_champs . ' regexp(\'' . $expreg . '\')';
     
    7667                                                                        $where_reg[] = $nom_champs . ' <> \'\'';
    7768                                                        }
    78                                                 $where .= (!empty($where_reg)) ? ' AND (' . implode(' or ', $where_reg) . ')' :"";
     69                                                        $where .= (!empty($where_reg)) ? ' AND (' . implode(' or ', $where_reg) . ')' :"";
     70                                                }
     71                                                // On réduit la recherche à une branche du site
     72                                               
     73                                                $where .= ($branche > 0) ? ' AND (id_rubrique IN(' . implode(',', linkcheck_marmots($branche)) . '))' : "";
     74                                               
     75                                                // On exclus de la selection, les objet dont le status est refuse ou poubelle
     76       
     77                                                if(isset($info_table['field']['statut'])){
     78                                                        $where .= ' AND '.sql_in('statut',array('publie','prop','prepa'));;
     79                                                }
     80
     81                                                $sql = sql_allfetsel($nom_champ_id.','.$champs_a_traiter, $table_sql, $where,'',$nom_champ_id.' ASC');
     82
     83                                                //echo(sql_get_select($nom_champ_id.','.$champs_a_traiter, $table_sql, $where,'',$nom_champ_id.' ASC'));
     84                                                //exit();
     85                                                //pour chaque objet
     86                                                $table_objet = table_objet($table_sql);
     87                                                foreach($sql as $id => $res){
     88                                                        //on créé les variables à envoyer
     89                                                        $id_objet=$res[$nom_champ_id];
     90                                                        unset($res[$nom_champ_id]);
     91                                               
     92                                                        //on liste les liens
     93                                                        $tab_liens = linkcheck_lister_liens($res);
     94
     95                                                        //on les insere dans la base
     96                                                        linkcheck_ajouter_liens($tab_liens,$table_objet,$id_objet);
     97                                                       
     98                                                        //on renseigne les ids de reprise
     99                                                        ecrire_config('linkcheck_dernier_id_objet', $id_objet);
     100                                                }
     101                                                //on renseigne l'indice de la table
     102                                                ecrire_config('linkcheck_dernier_objet', $key_table);
    79103                                        }
    80                                        
    81                                         // On réduit la recherche à une branche du site
    82                                        
    83                                         $where .= ($branche > 0) ? ' AND (id_rubrique IN(' . implode(',', linkcheck_marmots($branche)) . '))' : "";
    84                                        
    85                                         // On exclus de la selection, les objet dont le status est refuse ou poubelle
    86 
    87                                         if(isset($desc['field']['statut']))
    88                                                 $where .= ' AND !(statut=\'poubelle\' || statut=\'refuse\')';
    89                                        
    90                                         $sql = sql_select($nom_champ_id.','.$champs_a_traiter, $table_sql, $where,'',$nom_champ_id.' ASC');
    91                                         //echo(sql_get_select($nom_champ_id.','.$champs_a_traiter, $table_sql, $where,'',$nom_champ_id.' ASC'));
    92                                         //exit();
    93                                         //pour chaque objet
    94                                         while($res = sql_fetch($sql)){
    95                                                
    96                                                 //on créé les variables à envoyer
    97                                                 $id_objet=$res[$nom_champ_id];
    98                                                 unset($res[$nom_champ_id]);
    99                                        
    100                                                 //on liste les liens
    101                                                 $tab_liens = linkcheck_lister_liens($res);
    102                                                
    103                                                 //on les insere dans la base
    104                                                 linkcheck_ajouter_liens($tab_liens,$table,$id_objet);
    105                                                
    106                                                 //on renseigne les ids de reprise
    107                                                 ecrire_meta('linkcheck_dernier_id_objet', $id_objet);
    108                                         }
    109                                         //on renseigne l'indice de la table
    110                                         ecrire_meta('linkcheck_dernier_objet', $key_table);
    111104                                }
    112105                        }
    113106                       
    114107                        //quand la fonction a été executée en entier on renseigne la base
    115                         ecrire_meta('linkcheck_etat_parcours', true);
     108                        ecrire_config('linkcheck_etat_parcours', true);
    116109                       
    117110                        //on lance analyse des liens trouvés
  • _plugins_/linkcheck/trunk/inc/linkcheck_fcts.php

    r92068 r92093  
    4747function linkcheck_lister_liens($champs){
    4848        include_spip('inc/lien');
    49         include_spip('inc/linkcheck_vars');
    5049        $liens = array(); //tableau des liens pour detection des liens supprimés dans l'objet
    5150
    5251        if(!is_array($champs))
    5352                $champs=array("texte" => $champs);
     53
    5454        $classe_alpha='a-zA-Z0-9âäéèëêïîôöùüû²';
    5555        $tab_expreg = array(
     
    6969                                }
    7070                        }
    71                         // Ajout du prefix http:// si nessecaire
     71                        // Ajout du prefix http:// si necessaire
    7272                        foreach ($tab_temp as &$url_site) {
    7373                                $temp=$url_site;
     
    140140
    141141        $head = @get_headers($url);
     142
    142143        if(!$head)
    143144                $head = @linkcheck_get_headers($url);
     
    145146        if($head){
    146147                if(preg_match('`[0-9]{3}`', $head[0], $status)){
    147                         $ret['etat'] = $tabStatus[0][$status[0][0]];
     148                        $ret['etat'] = isset($tabStatus[0][$status[0][0]]) ? $tabStatus[0][$status[0][0]] : 'malade';
    148149                        $ret['code'] = $status[0];
    149150                }
     
    163164        }
    164165        if($fp) {
    165                 stream_set_timeout($fp, 10);
    166166                $head = "HEAD ".@$url_info['path']."?".@$url_info['query'];
    167167                $head .= " HTTP/1.0\r\nHost: ".@$url_info['host']."\r\n\r\n";
     
    217217               
    218218                        if($type_objet!='auteur') {
    219                                 $ret['etat'] = $tabStatus[1][$statut_objet]; $ret['code'] = $statut_objet;}
     219                                $ret['etat'] = isset($tabStatus[1][$statut_objet]) ? $tabStatus[1][$statut_objet]:'malade'; $ret['code'] = $statut_objet;}
    220220                        else {
    221221                                $ret['etat'] = $tabStatus[1]['publie']; $ret['code'] = 'publie';}
     
    262262        $limit = $cron ? 50:10;
    263263
    264         $sql = sql_select( '*','spip_linkchecks',$where,'','etat, id_linkcheck ASC','0,'.$limit);
    265         while($res = sql_fetch($sql)){
     264        $sql = sql_allfetsel('*','spip_linkchecks',$where,'','etat, id_linkcheck ASC','0,'.$limit);
     265        foreach($sql as $res){
    266266                linkcheck_maj_etat($res);
    267                 ecrire_meta('linkcheck_dernier_id_lien', $res['id_linkcheck']);
     267                ecrire_config('linkcheck_dernier_id_lien', $res['id_linkcheck']);
    268268                $cpt++;
    269269                if($cpt>$limit)
    270270                        break;
    271271        }
    272         ecrire_meta('linkcheck_dernier_id_lien', 0);
     272        ecrire_config('linkcheck_dernier_id_lien', 0);
    273273}
    274274
     
    282282function linkcheck_maj_etat($res){
    283283        //si le champ est inférieur à 6
    284         if($res['essais']<6){
     284        if(isset($res['essais']) && $res['essais']<6){
    285285                //on incrémente le champ
    286286                sql_updateq('spip_linkchecks', array('essais' => $res['essais']++), 'id_linkcheck='.$res['id_linkcheck']);
     
    292292                $test['etat'] = $tabStatus[0][1];
    293293                $test['code'] = '119';
     294                sql_updateq('spip_linkchecks', array('essais' => 0), 'id_linkcheck='.$res['id_linkcheck']);
    294295        }
    295296        //on met le champ à 0
    296         sql_updateq('spip_linkchecks', array('essais' => 0), 'id_linkcheck='.$res['id_linkcheck']);
     297       
     298       
    297299        //sinon on le signale comme malade
    298300        sql_updateq('spip_linkchecks', array('etat' => $test['etat'], 'code' => $test['code'], 'maj' => date('Y-m-d H:i:s')), 'id_linkcheck='.$res['id_linkcheck']);
  • _plugins_/linkcheck/trunk/inc/linkcheck_vars.php

    r92068 r92093  
    88########################################################################################################################
    99
    10 function linkcheck_champs_a_traiter($table=''){
    11         $tab_champs = array(    'bio'           => 1,
    12                                                         'chapo'         => 1,
    13                                                         'descriptif'=> 1,
    14                                                         'message'       => 1,
    15                                                         'ps'            => 1,
    16                                                         'texte'         => 1,
    17                                                         'virtuel'       => 0,
    18                                                         'url_syndic'=> 0,
    19                                                         'url_site'      => 0,
    20                                                         'url'           => 0 );
    21        
     10function linkcheck_champs_a_traiter($table){
     11        $tab_champs = array();
     12        foreach($table['field'] as $nom_champ => $type_champ){
     13                if (preg_match(',^(tiny|long|medium)?text\s,i', $type_champ)){
     14                        if(preg_match('/url/',$nom_champ))
     15                                $tab_champs[$nom_champ] = 0;
     16                        else
     17                                $tab_champs[$nom_champ] = 1;
     18                }
     19        }
    2220        return $tab_champs;
    2321}
     
    3028
    3129function linkcheck_tables_a_traiter(){
    32         return array('auteur', 'rubrique','article','syndic','breve','mot');
     30        $tables_spip = lister_tables_objets_sql();
     31        $tables = array();
     32        foreach($tables_spip as $key => $table){
     33                if($table['principale'] == 'oui' && $key != "spip_syndic_articles")
     34                        $tables[] = array($key => $table);
     35        }
     36        return $tables;
    3337}
    3438
Note: See TracChangeset for help on using the changeset viewer.