Getlib: ramener des bibliotheques & frameworks en local en une ligne [Edité]

Certains se souviennent peut-être de goofi, pour récupérer des google fonts en local; sur la base de ce script, j'ai bricolé une version qui permettra de faire la même chose avec les bibliothèques et frameworks (notamment js) que tout un chacun utilise et dont l'appel participe aux stats de google et consorts à chaque requête sur leur serveur.

Donc, en gros, il suffit de remplacer l'appel du script dans le en ajoutant getlib.php?url= devant.

Ainsi

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

deviendra

<script src="http://monserveur/getlib.php?url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Le fichier est récupéré une seule fois et seule la vertsion locale sera renvoyée par la suite.

Au cas où vous voulez que le script récupère une éventuelle mise à jour, il suffit d'ajouter update dans l'url:

<script src="http://monserveur/getlib.php?update&url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Getlib vérifiera alors si le fichier distant a changé et le retéléchargera si c'est nécessaire.

Comme avec Goofi, seule l'IP du serveur qui héberge le script est connue du serveur distant, jamais celle du visiteur.

C'est tout! Je n'ai pas testé à fond encore et les erreurs ne sont pas gérées pour le moment, mais ça fonctionne quand même pas mal !

<?php 
# get libs from distant servers to local (& avoid unnecessary requests to servers who can log user's connections)
# ex:  
# https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# becomes
# getlib.php?url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# if you want to update local file if the distant one changes, just add "update" 
# getlib.php?update&url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# author: warriordudimanche.net
# 
$lib_folder='libs/';
$check_updates=isset($_GET['update']);

if (!empty($_GET['url'])){
    if (!is_dir($lib_folder)){mkdir($lib_folder);}

    $url=strip_tags($_GET['url']);
    define('LOCAL_FILENAME',$lib_folder.basename($url));
    $ext=pathinfo(LOCAL_FILENAME)['extension'];
    //$flag='non';
    if (
        !is_file(LOCAL_FILENAME)
        ||
        ($check_updates && !isSameFile($url))

    ){
        $lib=file_get_contents($url,false,null,0,1000000);
        file_put_contents(LOCAL_FILENAME,$lib);
        $head = array_change_key_case(get_headers($url, TRUE));
        file_put_contents(LOCAL_FILENAME.'.info', $head['last-modified']);
        //$flag='oui';
    }
    if ($ext=='css'){
        $mime='text/css';
    }elseif ($ext=='js'){
        $mime='text/javascript';
    }else{
        $mime=mime_content_type(LOCAL_FILENAME);
    }

    header('Content-Type: '.$mime);
    exit(file_get_contents(LOCAL_FILENAME));
}


function isSameFile($url){
    $head = array_change_key_case(get_headers($url, TRUE));
    $local=file_get_contents(LOCAL_FILENAME.'.info');
    $distant=$head['last-modified'];
    return $distant==$local;
}

getlib.zip le dépôt

Comme toujours,
c'est aux autres de débugger
les scripts que tu commets, heu... commit...
super.
🗦

Et je vais t avouer un truc  j ai même pas honte   C est même ma marque de fabrique  une genre de  Bronco s touch .jpg

❝ 3 commentaires ❞

1  jerry wham le

Merci pour le script mais, dis-donc, les variables en global, c'eay-le-mal non ?
J'ai donc nettoyé ton script pour en faire une class claaasse (par contre, j'ai pas test ) :

<? php
# get libs from distant servers to local (& avoid unnecessary requests to servers who can log user's connections)
# ex:
# https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# becomes
# getlib.php?url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# if you want to update local file if the distant one changes, just add "update"
# getlib.php?update&url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# author: warriordudimanche.net
#
class getLib() {

private $lib_folder='libs/';
private $check_updates=false;
private $local_filename='';
private $url='';

public __construct() {
$this->check_updates=isset($_GET['update']);
if (!empty($_GET['url'])){
if (!is_dir($this->lib_folder)){mkdir($this->lib_folder);}

$this->url=strip_tags($_GET['url']);
$this->local_filename=$this->lib_folder.basename($this->url);
$flag='non';
if (
!is_file($this->local_filename)
||
($this->check_updates && !this->isSameFile())

){
$this->getDistantFile($this->url);
$flag='oui';
}
header('Content-Type: '.mime_content_type($this->local_filename));
exit(file_get_contents($this->local_filename));
}
}

private function getDistantFile($url){
$lib=file_get_contents($url);
file_put_contents($this->local_filename,$lib);
$head = array_change_key_case(get_headers($url, true));
file_put_contents($this->local_filename.'.info', $head['last-modified']);
}

private function isSameFile(){
$head = array_change_key_case(get_headers($this->url, true));
$local=file_get_contents($this->local_filename.'.info');
$distant=$head['last-modified'];
return $distant==$local;
}
}

new getLib();

 
2  AAA le

Si je visite le lien "http://monserveur/getlib.php?update&url=https://gros-fichier-de-10-To" ça va le sauvegarder sur monserveur et me le servir ? Sympa pour les utilisateurs, un peu moins pour le proprio du site.

 
3  Bronco le

Au départ, c'est un script qui n'est pas censé être utilisé par le public comme une api, mais par le webmestre pour rapatrier localement et automatiquement les libs.
Ceci dit, le point que tu soulèves est pertinent et on peut facilement résoudre le problème en limitant la taille des fichiers à 1mo par exemple dans le file_get_content (les libs dépassent rarement cette taille)

 

Fil RSS des commentaires de cet article

✍ Écrire un commentaire

Inutile de poster un commentaire à la con pour vous faire de la pub, ce sera filtré et dégagé direct...

Quelle est la première lettre du mot tvvz ?