web-dev-qa-db-fra.com

Web grattant à l'aide de transitoires

J'utilise xPath pour extraire les dates de tournées d'un autre site Web (avec la permission bien sûr). Comme il met à jour à chaque chargement de page, j'ai pensé à utiliser des transitoires pour stocker les données.

Malheureusement, je n'ai aucune expérience en matière de transitoires et je ne parviens pas à le faire fonctionner. Ceci est mon code:

<?php
  $html = file_get_contents('http://www.example.com');       
  $doc = new DOMDocument();

  libxml_use_internal_errors(TRUE); // disable libxml errors

  if(!empty($html)) {

    $doc->loadHTML($html);
    libxml_clear_errors();

    $xpath = new DOMXPath($doc);

    // Get only the content needed
    $termine = $xpath->query('//ul[@class="artistEvents"]/li');            

    if ($termine->length > 0) {
      foreach ($termine as $termin) { 

        $date = $xpath->query("div[@class='left']/strong", $termin);
        $location = $xpath->query("div[contains(@class,'right')]", $termin);

        echo '<tr>';

        // Date     
        if ($date->length > 0) {
          $date = substr($date->item(0)->nodeValue, 3, 10);
          $date = strftime("%d.%m.%Y", strtotime($date));
          echo '<td class="live-date">' . $date . '</td>';
        }

        // Location
        if ($location->length > 0) {
          $location = substr($location->item(0)->nodeValue, 14);
          $location = utf8_decode($location);
          echo '<td class="live-location">' . $location . '</td>';
        }

        echo '</tr>';
      }
    }

    else {
      echo '<p>No dates available.</p>';
    }

  }
?>

Toute aide sur la manière d’utiliser les transitoires pour stocker cette requête est grandement appréciée! De plus, je n’ai jamais utilisé xPath auparavant. Par conséquent, si mon code nécessite des améliorations (bien que cela fonctionne), je serai heureux de le savoir.

Merci beaucoup!

1
Stefan

Essayez quelque chose comme ça, ce qui économiserait en transitoire pendant 12 heures. Faites-moi savoir si quelque chose n'a pas de sens.

<?php
$value = get_transient( 'value' );
if ( false === $value ) {
  $output = "";
  $html = file_get_contents('http://www.example.com');       
  $doc = new DOMDocument();

  libxml_use_internal_errors(TRUE); // disable libxml errors

  if(!empty($html)) {

    $doc->loadHTML($html);
    libxml_clear_errors();

    $xpath = new DOMXPath($doc);

    // Get only the content needed
    $termine = $xpath->query('//ul[@class="artistEvents"]/li');            

    if ($termine->length > 0) {
      foreach ($termine as $termin) { 

        $date = $xpath->query("div[@class='left']/strong", $termin);
        $location = $xpath->query("div[contains(@class,'right')]", $termin);

        $output .= '<tr>';

        // Date     
        if ($date->length > 0) {
          $date = substr($date->item(0)->nodeValue, 3, 10);
          $date = strftime("%d.%m.%Y", strtotime($date));
          $output .= '<td class="live-date">' . $date . '</td>';
        }

        // Location
        if ($location->length > 0) {
          $location = substr($location->item(0)->nodeValue, 14);
          $location = utf8_decode($location);
          $output .= '<td class="live-location">' . $location . '</td>';
        }

        $output .= '</tr>';
      }
    }
    else {
      $output .= '<p>No dates available.</p>';
    }
  }
  $value = $output;
  set_transient( 'value', $value, 12 * HOUR_IN_SECONDS );

}
echo $value;
?>
3
czerspalace