MAJ automatique icones

Eléphanteau du PHP | 34 Messages

16 mars 2012, 23:21

Bonsoir,

Voici mon problème,

Sur mon FTP, j'ai un dossier avec des icônes, que je met à jour régulièrement.

Des FTP distants et différents (différents hébergeur aussi) possèdent des icônes. Si un icône vient a manquer, j'aimerais que ce FTP aille sur le mien, regarde si l'icône manquant est présent.
Si il est présent, qu’il le ramène sur le FTP distant et l'utilise, sinon, qu'il écrive sur mon FTP, dans un .txt l'extension manquante.

Voilà, j'ai besoin d'aide, je ne sais vraiment pas comment faire.

Merci beaucoup.

Bonne soirée

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

16 mars 2012, 23:58

Bonjour. Des fois une problème est mal compris car il est mal exprimé et donc devient difficile à solutionner. C'est le cas de ton problème, alors il faut d'abord nous aider à comprendre clairement ce que tu veux faire pour qu'on puisse comprendre et t'aider à le solutionner. Et si tout simplement ce que tu veux faire est impossible à programmer? On doit le savoir.

Maintenant je veux que tu commences à nous expliquer ce que toi tu entends par "FTP"? car tu as l'air de le considérer comme un acteur dans le traitement que tu décris. :?
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 34 Messages

17 mars 2012, 07:46

Bonjour,

On va prendre 2 sites Webs, le mien, possède un dossier plein d'icônes.
Le site Lambda possède un dossier mais n'a pas tous les icônes.

Quand le site Lambda a besoin d'un icône, qu'il ne possède pas, il va voir a l'adresse de mon site, si l’icône se trouve là.
Si il est présent sur mon site, j'aimerais qu'il copie cet icône sur le Site Lambda, pour l'utiliser ensuite.
Sinon, qu'il écrive un fichier .txt avec l'icône manquante sur mon site.

J'espère avoir été plus clair, c'est assez complexe.

Cordialement.

Boss

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

17 mars 2012, 13:16

Bon, j'ai finalement compris ce que tu veux faire et c'est assez simple, seulement je suis pas dispo maintenant, je te posterai une réponse détaillée dans le soir.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 34 Messages

17 mars 2012, 13:37

Merci beaucoup.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 mars 2012, 20:02

Bonjour,

Voici donc une piste qui peut t'intéresser. Sachant que les accès vont se faire sur des dossiers distants, il ne faut pas compter sur les fonction PHP de manipulation de dossiers comme glob(), scandir() ou readdir() car elles ne peuvent pas faire d'accès distant. Et puisque de toutes façons l'accès distant est sécurisé sur les sites, il faut donc se rabattre sur la solution idéale : L'ACCES FTP par PHP.

Voici donc une solution qui te permet de commencer :
L'objectif de cette solution est de parcourir un dossier nommé "/icones" se trouvant sur un site distant accédé par une connexion FTP pour chercher un nom de fichier donné nommé ($nomfichierRecherche).

Pour t'aider à réaliser ce programme je te propose le code suivant qui permet d'ouvrir une connexion FTP puis lister le dossier "/icones".
<?php
# Lister le contenu d'un dossier par FTP
################################################

# paramètres de connexion FTP
$ftp_server = "xxxxxxxxxxxxxxx"; # nom FTP du serveur ciblé
$login = "xxxxxxxxxxxxxxx"; # login de l'utilisateur ayant un droit d'accès
$password = "xxxxxxxxxxxxxxxx"; #mot de passe

# se connecter au serveur FTP
$connect = ftp_connect($ftp_server) or die("Impossible de trouver le serveur $ftp_server"); 

# ouvrir une session d'utilisateur
ftp_login($connect, $login, $password)or die("Connexion impossible en tant que $login");

# Récupération du contenu d'un dossier
$contenuDossier = ftp_nlist($connect, '/icones');
echo '<h1>Liste</h1><ul>';
if (is_array($contenuDossier)) foreach($contenuDossier as $fichier)
{
	echo '<p>'.$fichier.'</p>'; # affiche le contenu trouvé
}
else 
{
	echo '<p>Vide</p>'; # si contenu vide
}
echo '</ul>';

# fermeture de la connexion
ftp_close($connect);
?>
Voila, fait ça et verra plutard.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 34 Messages

18 mars 2012, 21:21

C'est une solution a laquelle j'avais pensé, mais je ne peut créer un deuxième login, je suis en hébergement mutualisé Perso et je n'ai pas le Multi-FTP.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 mars 2012, 22:18

C'est une solution a laquelle j'avais pensé, mais je ne peut créer un deuxième login, je suis en hébergement mutualisé Perso et je n'ai pas le Multi-FTP.
Et pourquoi as-tu besoin d'un multi-FTP puisque le programme (qu'on est en train de développer) sera exécuté par tous les sites lambda qui chercheront des icônes sur ton site principal (biblio d'icônes) et qu'il y moins de chances que ces sites lambda feront la recherche simultanément d'autant plus que la durée de la recherche sera vraiment rapide. ou alors je n'ai pas encore bien compris ton système.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 34 Messages

18 mars 2012, 22:30

Ce script sera sur mon site ? ou le site lambda distant ?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 mars 2012, 22:35

Ce script sera sur le site lambda distant car c'est lui qui doit initier la recherche puisqu'il est le seul concerné. Ton site se comportera comme un serveur d'icônes, c'est au autres site lambda distants de lancer chacun sa propre recherche et éventuellement écrire le fameux message (sous forme de fichier txt) d’icône manquante.

Voici le script complet:
<?php
# Rechercher un fichier dans un dossier par FTP
################################################

# paramètres de connexion FTP
$ftp_server = "xxxxxxxxxxxxxxx";
$login = "xxxxxxxxxxxxxxx";
$password = "xxxxxxxxxxxxx";
$dossierRecherche = "/icones";
$nomFichierRecherche = "/icones/icone1.ico";

# se connecter au serveur FTP
$connect = ftp_connect($ftp_server) or die("Impossible de trouver le serveur $ftp_server"); 

# ouvrir une session utilisateur
ftp_login($connect, $login, $password)or die("Connexion impossible en tant que $login");


# Recherche dans le dossier
$trouve = false;
$contenuDossier = ftp_nlist($connect, $dossierRecherche);
if (is_array($contenuDossier)) foreach($contenuDossier as $fichier)
{
	if (trim(strtolower($fichier)) == trim(strtolower($nomFichierRecherche))) 
	{
		# fichier trouvé
		$trouve = true;
		break; # arreter la recherche
	}
}

# si non trouve ecriture d'un evenement icone manquante dans un fichier FTP
if ($trouve == false)
{
	$file = 'icone_manquante'.date("Y-m-d-H-i-s").'.txt'; #nom daté
	file_put_contents($file, "Icône manquante: $nomFichierRecherche");
	$fp = fopen($file, 'r');
	ftp_fput($connect, $file, $fp, FTP_ASCII);
	fclose($fp);
}

# fermeture de la connexion
ftp_close($connect);

# resultat de la recherche
if ($trouve == true) echo "le fichier $nomFichierRecherche existe bien"; 
else echo "le fichier $nomFichierRecherche n'existe pas";

?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 34 Messages

18 mars 2012, 23:24

Ok, donc il faut bien que je fasse un autre login et un autre password pour ce script non ? je vais pas mettre mes identifiants sur un script que je vais distribuer :lol:
Et là, OVH me coince je pense. Ou alors je n'ai pas compris le fonctionnement.

Cdt.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 mars 2012, 23:48

Ah bah, si les sites lambda ne sont pas les tiennes alors là ça se complique car le problème est que le script doit avoir le droit d'accès en lecture et écriture pour écrire sa demande d'icône manquante. De ce fait, cette solution est non viable.

Dans ce cas, je te propose une seconde solution sans FTP qui considère ton site principal comme un serveur d'icônes et les sites lambda comme des sites clients qui demandent des icônes. Le script serveur reste donc uniquement sur ton site principal et des scripts clients se mettront sur les sites lambda distants.

Voici l'architecture:

1. Script serveur d'icône : serveurIcones.php
========================================
  • a. à la demande d'un site lambda qui envoi une requête HTTP de type GET demandant un fichier icône donné comme ça: http://tonsite.com/serveurIcones.php?fi ... rechercher
    b. recherche du fichier $_GET['fichier'] dans le dossier '/icones' se trouvant sur le serveur,
    c. si trouvé : renvoi le fichier trouvé par téléchargement MIME.
    d. si non trouvé écrire un événement "icône manquante" portant le nom $_GET['fichier'] dans le fichier texte servant de journal de notification des icônes recherchées et non trouvées.
2. Script client demandant une icône : clientIcones.php
=================================================
C'est ce script qui normalement contacte le script serveur quand il aura besoin d'une icône en envoyant une requête HTTP de la forme: http://tonsite.com/serveurIcones.php?fi ... rechercher
Il recevra en guise de réponse à cet appel HTTP soit rien soit l'icône demandée sous forme de contenu téléchargé et dans ce cas il doit écrire ce fichier dans le dossier "/icones" de son site.

L'avantage de cette solution est que chaque script exécute les opérations sur les fichiers (recherche, écriture) sur un dossier local et donc aucun problème de sécurité.

Voilà.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 34 Messages

19 mars 2012, 07:50

C'était un peu l'idée que je me faisait au début, mais le soucis survenait quand je devait transférer l'icône de mon site au site lambda, tu parle de téléchargement MIME, tu pourrait détailler un peu plus stp ?

Merci Beaucoup ;)

Bonne journée.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

19 mars 2012, 10:27

Je veux dire par "téléchargement MIME" le fait d'envoyer un contenu comme une pièce-jointe où le récepteur effectue une sorte d'upload de la pièce pour l'enregistrer chez lui.

La méthode idéale dans ton cas puisque le client qui recevra le fichier et le serveur qui l’enverra sont purement deux programmes et non deux utilisateurs via un navigateur, est d'utiliser les fonction PHP qui permettent de lire des flux HTTP comme les URL fopen ou CURL.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

19 mars 2012, 15:55

Voici une solution avec CURL exigeant que l'extension php_curl soit activée dans la config PHP.

La première fonction sera celle qui interroge une URL et enregistre le contenu renvoyé par la réponse HTTP de cette URL dans un fichier local. La voici dans ce script : curl.php
<?php
/* 
Script trouvé sur le site http://www.php.net/manual/fr/curl.examples.php - contribution de : jlee8df at gmail dot com 30-May-2008 01:47) que j'ai légèrement adapté pour qu'il n'enregistre pas les fichiers vides non trouvés sur le serveur en utilisant $fileInfo.
*/

# Download from URL to FILE
function cURLcheckBasicFunctions()
{
  if( !function_exists("curl_init") &&
      !function_exists("curl_setopt") &&
      !function_exists("curl_exec") &&
      !function_exists("curl_close") ) return false;
  else return true;
}

/*
 * Returns string status information.
 * Can be changed to int or bool return types.
 */
function cURLdownload($url, $file)
{
  if( !cURLcheckBasicFunctions() ) return "UNAVAILABLE: cURL Basic Functions";
  $ch = curl_init();
  if($ch)
  {
    $fp = fopen($file, "w");
    if($fp)
    {
      if( !curl_setopt($ch, CURLOPT_URL, $url) )
      {
        fclose($fp); // to match fopen()
        curl_close($ch); // to match curl_init()
        return "FAIL: curl_setopt(CURLOPT_URL)";
      }
      if( !curl_setopt($ch, CURLOPT_FILE, $fp) ) return "FAIL: curl_setopt(CURLOPT_FILE)";
      if( !curl_setopt($ch, CURLOPT_HEADER, 0) ) return "FAIL: curl_setopt(CURLOPT_HEADER)";
      if( !curl_exec($ch) ) return "FAIL: curl_exec()";
      $fileInfo = curl_getinfo($ch);
      curl_close($ch);
      fclose($fp);
      
      # return success if downloaded file is not empty else delete it
      if (isset($fileInfo['size_download']) && $fileInfo['size_download']>0){ 
		return "SUCCESS: $file is downloaded from [$url]"; 
      } 
      else {
		unlink($file);
		return "FAIL: $file is not found in this location [$url]";
      }
    }
    else return "FAIL: fopen()";
  }
  else return "FAIL: curl_init()";
}

# TEST OF FUNCTION Download from URL to FILE
#echo cURLdownload("http://www.google.fr", "CURL_example.txt");

?> 
Dans notre cas cette fonction sera utilisée par le client lambda qui envoi une demande de recherche d'un fichier (icone) sur un serveur d'icones (qu'on va écrire). Voici le script qui fait cette recherche via la fonction curl.
rechercheFichier.php:
<?php
# recherche d'un fichier donné
if (! isset($_GET['fichier'])) { exit(); }

# fonction curl de téléchargement d'une url dans un fichier local 
require_once("curl.php");

# Paramètres de la fonction curl
$fichierRecherche = $_GET['fichier'];
$URL = "http://localhost/echangeFichiers/serveur/serveurFichiers.php?fichier=".$fichierRecherche;
$nomFichierAEnregistrer = $fichierRecherche; #ici, vous pouvez donner le nom du fichier que vous voulez enregistrer

# exécution de la recherche/téléchargement
echo cURLdownload($URL, $nomFichierAEnregistrer); 
#si $fichierRecherche est trouvé dans le site $URL, il sera téléchargé et enregistré dans le fichier $nomFichierAEnregistrer
?>
$URL dans ce script correspond donc au script : serveurFichiers.php qui reçoit le paramètre "fichier" par GET (?fichier=".$fichierRecherche)

Le serveur de fichier est programmé pour rechercher l'existance du fichier donné $fichier dans un dossier précis puis renvoi son contenu par téléchargement MIME (header+content-type) au client demandeur sinon il écrit un événement dans le fichier journal local pour signaler l'absence du fichier (file_put_contents)

Voici le script serveur : serveurFichiers.php
<?php
if (isset($_GET['fichier'])){
  # traiter le fichier demandé 
  $file = "icones/".$_GET['fichier'];  
  # si le fichier existe alors le transmettre à l'affichage par téléchargement
  if (file_exists($file)){
	# télécharger fichier	
	if(ini_get('zlib.output_compression')) ini_set('zlib.output_compression', 'Off'); #pas de compression
	if(isset($_SERVER["HTTP_USER_AGENT"]) && strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) { #Pour IE
    		header("Content-Type: application/force-download");
    		header('Content-Description: File Transfer');
  	}
  	readfile($file);
	exit;
	# fin de téléchargement
  }
  else {
	# écrire un événement "fichier manquant" dans le journal
	$eventList = file_exists("journal.txt") ? file_get_contents("journal.txt") ."\r\n" : "";
	$eventList .= "Date: " .date("d/m/Y H:i:s"). " - Fichier manquant: " . $file;
	file_put_contents("journal.txt", $eventList);
  }

}
?>
Pour tester ces scripts j'ai créé un dossier principal nommé "echangeFichiers" dans lequel j'ai placé 2 dossiers : "serveur" et "client".

Le dossier "serveur" doit contenir les éléments suivants:
1. un dossier "icones" contenant quelques icônes comme "icone1.ico", "icone2.ico" ...
2. le script "serveurFichiers.php"

Le dossier "client" doit contenir les éléments suivants:
1. le script "curl.php"
2. le script "rechercheFichier.php" qui fait un require_once() du fichier curl.php car il utilise sa fonction curl.

Pour exécuter un test il suffit d'appeler le script "rechercheFichier.php" du dossier client comme ça par exemple:
http://localhost/echangeFichiers/client ... icone3.ico

Et voila. :wink:
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène