2017-08-26 4 views
0

il y a un script (je par exemple sur place 8)Comment ajouter la mise en cache au script php?

<?php 

    $map = function($array, $from, $to){ 
     $result = []; 
     if(!empty($array) && is_array($array)){ 
      foreach ($array as $element) { 
       $key = $element[$from]?:null; 
       $value = $element[$to]?:null; 
       if($key && $value){ 
        $result[$key] = $value; 
       } 
      } 
     } 
     return $result; 
    }; 

    $airlines = $map(json_decode(file_get_contents('http://aviaciya.com/json/airlines.json'), true), 'iata', 'name'); 
$cit=json_decode(file_get_contents("http://avia-avia.ru/json/cities.json")); $cities=array(); foreach($cit as $val) { if(property_exists($val->name_translations,"ru")) $cities[$val->code]=$val->name_translations->ru;} 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://api.travelpayouts.com/v1/prices/cheap?origin=MOW&destination=AER&limit=30&token=**************"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($ch, CURLOPT_HEADER, FALSE); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Access-Token: *************")); 
    $response = curl_exec($ch); 
    curl_close($ch); 
    $products=json_decode($response,true); 
    $replace_value = function($key, $val) use ($cities, $airlines){ 
     $response = $val; 
     switch($key){case 'destination': 
       $response = $cities[$val];break; 
       case 'origin': 
       $response = $cities[$val];break; 
      case 'airline': 
       $response = $airlines[$val]; 
       break; 
     } 
     return $response; 
    } 

    ?> 








    <div id="kurorty" class="container-fluid"> 

    <div class="table-responsive"><h5>Авиабилеты Москва Адлер</h5><table class="table table-hover"> 
     <thead> 
      <tr> 
      <th style="text-align: center;"> Пункт отправления</th> 
      <th style="text-align: center;">Пункт назначения </th> 
      <th class="mob" style="text-align: center;"> Авиакомпания</th> <th style="text-align: center;">Цена, р.</th> <th class="mob" style="text-align: center;">Дата вылета</th> 
    <th class="mob" style="text-align: center;">Обратная дата</th> 
    <th> </th> 
      </tr> 
     </thead> <tbody> 
    <?php 
    if(isset($products['data']) && is_array($products['data'])) { 
    foreach ($products['data'] as $key => $data) { 
    foreach ($data as $destination => $row) { 
    if (preg_match('/[A-Z]{3}/i', $key)) { 
    ?> 
    <tr> 
    <td>&nbsp; <?php echo Москва ;?>&nbsp;</td> 
      <td>&nbsp; <?= $replace_value('destination',$key) ? $replace_value('destination', $key) : "<b>" .'Обновл.'. "</b>"; ?>&nbsp; </td> 

     <td class="mob"><img height="50" alt="" width="120" src="http://pics.avs.io/180/70/<?= $row['airline']?>.png" /></td> 
    <td><?php echo $replace_value('price', $row['price']); ?>&nbsp; RUB &nbsp; </td> 
    <td class="mob"><?php echo $replace_value('departure_at', substr($row['departure_at'], 0, 10)); ?></td> 
    <td class="mob"><?php echo $replace_value('return_at', substr($row['return_at'], 0, 10)); ?></td> 
      <td><a rel="nofollow" role="button" alt="авиабилеты Москва <?php echo $replace_value('destination',$key); ?>" title="авиабилеты Москва <?php echo $replace_value('destination',$key); ?>" href="https://bilety.avia-avia.ru/flights/?origin_iata=MOW&destination_iata=<?=$key?>&depart_date=<?=substr($row['departure_at'], 0, 10)?>&return_date=<?=substr($row['return_at'], 0, 10)?>&adults=1&children=0&infants=0&trip_class=0&marker=87111&with_request=true">Поиск</a></td></tr> 
    <?php 
    } 
    } 
    } 
    } 
    ?> </tbody> 
     </table> 
    </div> 

Dans les scripts suivants, je n'utilise cette ligne plus

$airlines = $map(json_decode(file_get_contents('http://aviaciya.com/json/airlines.json'), true), 'iata', 'name'); 
$cit=json_decode(file_get_contents("http://avia-avia.ru/json/cities.json")); $cities=array(); foreach($cit as $val) { if(property_exists($val->name_translations,"ru")) $cities[$val->code]=$val->name_translations->ru;} 

C'est ce que une bonne personne m'a écrit:

"Le script est très simple, vous prenez json et le sauvegarder, il y a un quelques lignes pour corriger votre script, et dans votre code seulement le U RL devra être changé. " L'idée est que vous devez enregistrer des produits $ dans un fichier et lire à partir de ce fichier. "

Tout est si simple, seulement pour moi c'est une forêt de cliquetis." S'il vous plaît, aidez, mes mains tombent déjà.

Merci beaucoup d'avance pour votre aide, avec beaucoup de respect.

+1

Si vous n'avez pas besoin d'utiliser ces deux lignes, vous devez garder les deux variables appelées $ airlines et $ cities, comme l'a dit le Bon Samaritain. Vous pouvez ... les stocker dans une variable de session si vous deviez les utiliser dans d'autres scripts plutôt que dans un fichier. –

+1

La mise en cache de cette manière de scripts signifie désactiver le file_get_contents avec une cible distante. Téléchargez le fichier (avec php) à votre localhost et lisez le contenu à partir de là. De plus, vous pouvez vérifier le fichier filemtime pour télécharger à nouveau le fichier, donc ce sera la fonctionnalité de mise en cache facile. – rebru

+0

@rebru Pouvez-vous réparer le script comme vous l'avez dit "simple mise en cache" et émettre une réponse? Je vous serai très reconnaissant, je n'ai pas écrit le site, je l'ai acheté prêt, et voici une telle embuscade. Meilleures salutations – Arcadiy

Répondre

1

Voilà, ajoutez ceci dans la tête de votre script

/** 
* Function to get cacheFile 
* @param $srcfile 
* @return string 
*/ 
function cacheFile($srcfile) 
{ 
    /* Defintions */ 
    /** 
    * string Cachepath is the path to your www-user writeable directory, this can be relative or absolute 
    */ 
    $cachePath = './'; 


    /** 
    * array srcfiles, key is Identifier and value is the full link to the json file 
    */ 
    $srcfiles = [ 
     'airline' => 'http://aviaciya.com/json/airlines.json', 
     'cities' => 'http://avia-avia.ru/json/cities.json' 
    ]; 


    /** 
    * Autogenerated from cachePath and srcfiles 
    */ 
    $cacheFile = $cachePath.end(explode("/", $srcfiles[$srcfile])); 


    /** 
    * int Time in seconds for cache 
    */ 
    $cachingTime = 600; 


    /** 
    * @param $cacheFile 
    * @param $url 
    */ 
    $downloader = function($cacheFile, $url) { 
     file_put_contents($cacheFile,file_get_contents($url)); 
    }; 

    /* CreateCache File if it doesnt exists */ 
    if(!file_exists($cacheFile) || time() - filemtime($cacheFile) > $cachingTime) { 
     $downloader($cacheFile, $srcfiles[$srcfile]); 
    } 

    return $cacheFile; 
} 

Ensuite, vous pouvez appeler ce chargeur au lieu de donner le nom de domaine complet à la fonction file_get_contents, comme ça ...

$airlines = map(json_decode(file_get_contents(cacheFile('airline')), true), 'iata', 'name'); 
$cit=json_decode(file_get_contents(cacheFile('cities'))); $cities=array(); foreach($cit as $val) { if(property_exists($val->name_translations,"ru")) $cities[$val->code]=$val->name_translations->ru;} 

Mise à jour

  • Meilleure fonction de téléchargement (uniquement cacheFile et URL en tant que paramètres)
  • file existence et filemtimecheck en une fois