Membres


Pas encore membre ?
inscrivez-vous ici

Connexion :
Login
Code
Mot de passe perdu ?
Liste des membres

Connexion php+telechargement fichiers

Connexion php+telechargement fichiers


Connexion php+telechargement fichiers     Posté le 29/04/2008 à 13:05
Agilec
Membre
agilec
4 posts
Inscrit le : 29/04/2008
Bonjour,
Je commence à apprendre le php, et j’ai un problème et je vois pas comment on peut le résoudre.
Enoncé : j’ai deux serveurs (serveur1 et serveur 2)
Chaque serveur possède une base de données (bd1 pour le serveur 1 et bd2 pour le serveur2)
Chaque bd contient des informations concernant des utilisés par le serveur(Nom du fichier, url du fichier, version du fichier)
Ce qu’il faut faire :
Le serveur1 se connecte au serveur2
Le serveur1 se connecte à la bd2 du serveur2 et vérifie la mise à jour des fichiers stocké(il compare la version du fichier stocké dans bd2 avec celle stocké dans sa base bd1) :
 Si les version sont identiques : le serveur1 ne fait rien et se déconnecte du serveur2

 Si la version stocké dans bd1> version stocké dans bd2 : le serveur 1 actualise la bd2 du serveur2 en stockant la nouvelle version du fichier, ensuite il demande au serveur2 de mettre à jour les fichiers qu’il utilise : En réponse à cette requête, le serveur 2 doit télécharger la nouvelle version du fichier.

&#61607; Si la version stocké dans bd1< version stocké dans bd2 : le serveur 1 récupère ces données et actualise sa bd, ensuite télécharge le fichier.

Toutes ces opérations doivent se faire sans l’intervention de l’utilisateur.

Si quelqu’un à une idée, une piste ou un bout de code pour commencer, ça sera génial. Vraiment je sais pas d’où commencer !!!
Je vous remercie d’avance.

 
Réponse à : Connexion php+telechargement fichiers     Posté le 29/04/2008 à 17:13
sky
Administrateur
Avatar
Site perso
4158 posts
Inscrit le : 13/08/2003
Salut

Je suis en train de me faire un petit test réèl parce que je n'ai jamais fais ce genre de projet.

En attendant, je te conseil de lire cette article qui contiend des solutions : http://www.phpfrance.com/tutoriaux/index.php/2008/04/21/49-serveur-objets-php5-1ere-partie

Sky

_______________________
Graphiks : Cours PHP
Image
=> à quoi sert internet explorer ?
=> à télécharger firefox
 
Réponse à : Connexion php+telechargement fichiers     Posté le 29/04/2008 à 18:44
sky
Administrateur
Avatar
Site perso
4158 posts
Inscrit le : 13/08/2003
Salut

J'ai fais un petit test sur deux serveurs.
Voici comment j'ai procéder :

Le serveur 1 est le "maitre".
C'est sur le serveur 1 que l'on effectue une vérification tous les 5mn.

Donc, sur le serveur 1 :
check.php
file.php

Sur le serveur 2 :
api.php
file.php


Le serveur 1 se connecte à l'API du serveur 2 pour récupéré la liste des fichiers ainsi que leurs versions.
Puis, compare la liste des fichiers ainsi que leurs versions :

- si le fichier du serveur 1 est plus petit que le même fichier du serveur 2, on met à jours le serveur 1 en appellant file.php du serveur 2 pour qu'il nous donne le fichier demandé, puis on met à jours la BDD du serveur1
- si le serveur 1 a un fichier plus récent que le serveur 2, on appelle le fichier file.php du serveur 2 pour qu'il demande lui le fichier file.php du serveur 1 qui donnera le fichier souhaité puis file.php du serveur 2 mettra sa BDD à jours


Bon, ceci est vraiment comme ça et sans beaucoup de test, mais ça à l'air de marcher.


Les codes sources :
check.php du serveur 1
<?php
define
('CLEF''tGufgsdofdgds5g4d6r4ze98qr7ezhyR48dKpLojd58'); 
// Je suis serveur 1


/**
  * Le principe : 
  *
  * check.php test si y'a des fichiers sur le serveur 1 périmés.
  * si c'est le cas, faut faire deux actions :  
  *   - Mettre à jours le fichiers du serveur 1 avec le fichier du serveur 2
  *   - Mettre la BDD1 à jours avec la bonne version
  *
  * file.php va : 
  *   - allez cherchez la nouvelle version du fichier sur le serveur 2
  *   - faire un output du fichier demandé par le serveur 2
  *
  */


// cette fonction permet de regler la plupart des soucis de PHP entre serveur
function getcontent($server$port$file)
{
    
$cont "";
    
$ip gethostbyname($server);
    
$fp fsockopen($ip$port);
    if (!
$fp)
    {
        return 
"Unknown";
    }
    else
    {
        
$com "GET $file HTTP/1.1rnAccept: */*rnAccept-Language: de-chrnAccept-Encoding: gzip, deflaternUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0;  ;Windows NT 5.0)rnHost: $server:$portrnConnection: Keep-Alivernrn";
        
fputs($fp$com);
        while (!
feof($fp))
        {
            
$cont .= fread($fp500);
        }
        
fclose($fp);
        
$cont substr($contstrpos($cont"rnrn") + 4);
        return 
$cont;
    }
}


// le serveur 2 : 
$serveur_distant 'www.domaine2.com';


// connexion mysql
mysql_connect('localhost','****','****');
mysql_select_db('****');

// on recupere la liste des fichiers presente sur le serveur
$allfiles = array();
$requete "SELECT * FROM files";
$sql mysql_query($requete);
$nbr mysql_num_rows($sql);
while(
$file mysql_fetch_array($sql))
{
  
$allfiles[$file['id']] = $file;
}



// on utilise l'API du serveur 2 pour recuperer la liste des fichiers present ainsi que leurs version
$content getcontent($serveur_distant"80"'/file.php?key='.CLEF.'&action=getFileList');


if(
$content === false)
  exit(
'Erreur de test provenant de l\'api sur le serveur 2');
else
{
  
$unserialised unserialize($content);
  
$toUpdate '';
  
  foreach(
$allfiles as $id=>$data)
  {
    
// on test si les version du serveur 2 sont plus grand
    
if($data['version'] < $unserialised[$id]['version'])
    {
 
      
$content getcontent($serveur_distant"80"'/file.php?key='.CLEF.'&action=getFile&fileId='.$id);
      
      
// si 1, on met à jours la BDD du serveur 1
      
if(!empty($content))
      {
        
// on remplace le nouveau contenu - fopen w+ puis sauvegarde. - serai rapide avec touch(), mais pour  le moment restons simple.
        
$local_file $data['filedir'].$data['name'];
        
$fp fopen($local_file"w");
        
        
$reponse = (fwrite($fp$content)) ? true false;
        
fclose($fp);
        
        if(
$reponse == true)
        {
          
$requete "UPDATE files SET version='".$unserialised[$id]['version']."' WHERE id='$id'";
          
mysql_query($requete);
        }
        else
          echo 
'Erreur de maj sur le fichier '.$id.'<br />';
      }
      else
        echo 
'Erreur de recuperation du fichier '.$id;
    }
    
    
// on test si les version du serveur 2 sont périmé par rapport au serveur 1
    
if($data['version'] > $unserialised[$id]['version'])
    {
      
// on update le fichier du serveur 2 avec le fichier du serveur 1
      
$reponse getcontent($serveur_distant"80"'/file.php?key='.CLEF.'&action=updateFile&fileId='.$id.'&fileVersion='.$data['version']);
      
      if(
$reponse === false)
        echo 
'Erreur de maj du fichier '.$id.'sur le serveur 2.';
    }
  }
  
  echo 
'Terminé';
}
?>


Le fichier file.php du serveur 1
<?php
define
('CLEF''tGufgsdofdgds5g4d6r4ze98qr7ezhyR48dKpLojd58'); 
// Je suis serveur 1


// est ce que cette requete comporte un mot de passe valide ?
if(empty($_GET['key']) || $_GET['key'] != CLEF)
  exit(
false);


// liste des actions OK : 
$actionAutorise = array('getFile','updateFile');

// ensuite, on demande quoi?
//  - une comparaison avec la liste de l'autre serveur en params (files)
//  - une liste de fichiers serialisé pour l'autre serveur
$action = (!empty($_GET["action"]) && in_array($_GET["action"], $actionAutorise)) ? $_GET["action"] : exit(false) ;



// connexion mysql
mysql_connect('localhost','****','****');
mysql_select_db('****');



switch(
$action)
{
  case 
'getFile':
  
    if(empty(
$_GET['fileId']) || !is_numeric($_GET['fileId']))
      exit(
false);
    
    
$fileId = (int)$_GET['fileId'];
    
    
// on restitu le fichier
    
$requete "SELECT * FROM files WHERE id='$fileId'";
    
$sql mysql_query($requete);
    if(
mysql_num_rows($sql) != 1)
      exit(
false);
      
    
$file mysql_fetch_array($sql);
    
readfile($file['filedir'].$file['name']);
    
  break;
}
?>



Le fichier file.php sur le serveur 2 :
<?php
define
('CLEF''tGufgsdofdgds5g4d6r4ze98qr7ezhyR48dKpLojd58'); 
// Je suis serveur 2

function getcontent($server$port$file)
{
    
$cont "";
    
$ip gethostbyname($server);
    
$fp fsockopen($ip$port);
    if (!
$fp)
    {
        return 
"Unknown";
    }
    else
    {
        
$com "GET $file HTTP/1.1rnAccept: */*rnAccept-Language: de-chrnAccept-Encoding: gzip, deflaternUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0;  ;Windows NT 5.0)rnHost: $server:$portrnConnection: Keep-Alivernrn";
        
fputs($fp$com);
        while (!
feof($fp))
        {
            
$cont .= fread($fp500);
        }
        
fclose($fp);
        
$cont substr($contstrpos($cont"rnrn") + 4);
        return 
$cont;
    }
}


// est ce que cette requete comporte un mot de passe valide ?
if(empty($_GET['key']) || $_GET['key'] != CLEF)
  exit(
false);


// liste des actions OK : 
$actionAutorise = array('getFile','updateFile');

// le serveur 1 : 
$serveur_distant 'www.domaine1.com';

// ensuite, on demande quoi?
//  - une comparaison avec la liste de l'autre serveur en params (files)
//  - une liste de fichiers serialisé pour l'autre serveur
$action = (!empty($_GET["action"]) && in_array($_GET["action"], $actionAutorise)) ? $_GET["action"] : exit(false) ;



// connexion mysql
mysql_connect('localhost','****','****');
mysql_select_db('****');



switch(
$action)
{
  case 
'getFile':
  
    if(empty(
$_GET['fileId']) || !is_numeric($_GET['fileId']))
      exit(
false);
    
    
$fileId = (int)$_GET['fileId'];
    
    
// on restitu le fichier
    
$requete "SELECT * FROM files WHERE id='$fileId'";
    
$sql mysql_query($requete);
    if(
mysql_num_rows($sql) != 1)
      exit(
false);
      
    
$file mysql_fetch_array($sql);
    
// header("Content-disposition: attachment; filename=".$file['name']);
    // header("Content-Length: ".filesize($file['filedir'].$file['name']));
    
readfile($file['filedir'].$file['name']);
    
  break;
  
  
  
  
  case 
'updateFile':
  
    if(empty(
$_GET['fileId']) || !is_numeric($_GET['fileId']))
      exit(
false);
    
$fileId = (int)$_GET['fileId'];
    
    if(empty(
$_GET['fileVersion']) || !is_numeric($_GET['fileVersion']))
      exit(
false);
    
    
$fileVersion = (int)$_GET['fileVersion'];
    
    
$requete "SELECT * FROM files WHERE id='$fileId'";
    
$sql mysql_query($requete);
    if(
mysql_num_rows($sql) != 1)
      exit(
false);
    
    
$file mysql_fetch_array($sql);

    if(
$file['version'] < $fileVersion)
    {
 

      
$content getcontent($serveur_distant"80"'/file.php?key='.CLEF.'&action=getFile&fileId='.$file['id']);
      
      
// si 1, on met à jours la BDD du serveur 1
      
if(!empty($content))
      {
        
// on remplace le nouveau contenu - fopen w+ puis sauvegarde. - serai rapide avec touch(), mais pour  le moment restons simple.
        
$local_file $file['filedir'].$file['name'];
        
$fp fopen($local_file"w");
        
        
$reponse = (fwrite($fp$content)) ? true false;
        
fclose($fp);
        
        if(
$reponse == true)
        {
          
$requete "UPDATE files SET version='".$fileVersion."' WHERE id='$id'";
          
mysql_query($requete);
        }
        else
          exit(
false);
      }
      else
        exit(
false);
    }
  
  break;
}
?>


Le fichier api.php sur le serveur 2 :
<?php
define
('CLEF''tGufgsdofdgds5g4d6r4ze98qr7ezhyR48dKpLojd58'); 
// Je suis serveur 2


// est ce que cette requete comporte un mot de passe valide ?
if(empty($_GET['key']) || $_GET['key'] != CLEF)
  exit(
false);


// liste des actions OK : 
$actionAutorise = array('getFileList','checkAgainst');

// ensuite, on demande quoi?
//  - une comparaison avec la liste de l'autre serveur en params (files)
//  - une liste de fichiers serialisé pour l'autre serveur
$action = (!empty($_GET["action"]) && in_array($_GET["action"], $actionAutorise)) ? $_GET["action"] : exit(false) ;



// connexion mysql
mysql_connect('localhost','****','****');
mysql_select_db('****');



switch(
$action)
{
  case 
'getFileList':
  
// on recupere la liste des fichiers presente sur le serveur
  // api.php?key=abc&action=getFileList&option=onlyVersion
  
$allfiles = array();
  
$requete "SELECT * FROM files";
  
$sql mysql_query($requete);
  
$nbr mysql_num_rows($sql);
  while(
$file mysql_fetch_array($sql))
  {
    
$allfiles[$file['id']] = $file;
  }
  echo 
serialize($allfiles); 
  break;
}
?>


Bon, comme j'ai déjà dit ... c'est un truc assès vite fais, mais ça donne une idée. Puis s'il faut c'est pas du tout ça que tu veux faire.

_______________________
Graphiks : Cours PHP
Image
=> à quoi sert internet explorer ?
=> à télécharger firefox
 
Réponse à : Connexion php+telechargement fichiers     Posté le 30/04/2008 à 10:40
agilec
Membre
Avatar
4 posts
Inscrit le : 29/04/2008
Bonjour;
Merci pour le code et les explications.
A vrai dire je dois comprendre le code et l'essayer Mais en gros c'est ça ce qu'il faut faire.
Une question:Pour la connexion des deux serveurs, si cette connection echoue, est ce qu'on peut ajouter une fonction qui permet de relancer automatiquement la connexion jusqu'a réussir à connecter les deux serveurs.


_______________________
Aucun
 
Réponse à : Connexion php+telechargement fichiers     Posté le 30/04/2008 à 10:47
sky
Administrateur
Avatar
Site perso
4158 posts
Inscrit le : 13/08/2003
On peut bien sur améliorer la fonction qui se connecte à l'autre serveur en ajoutant un while ou autre chose encore.

Pendant que j'y pense, ma méthode est surement pas complète et manque beaucoup de chose, c'est vraiment un exemple, bien que fonctionnel, ça reste vraiment une base.

Peut être que pour mettre à jours la BDD, une connexion de serveur à serveur serai beaucoup plus facile genre avec PDO puis utiliser ma méthodes d'API pour transférer les fichiers de serveur à serveur.

Tu peut aussi transférer les fichiers via FTP en utilisant PHP, mais j'aime beaucoup moins.

Sky

_______________________
Graphiks : Cours PHP
Image
=> à quoi sert internet explorer ?
=> à télécharger firefox
 
Vous n'est pas connecté en temps que membre, parceque j'en ai marre du spam, SEUL les membres peuvent poster des messages sur le forum.

Nous  -  Plan du site  -  Informations légale  -  Contact  -  © Graphiks.net