Trucs et astuces Express: Copie de fichier à heure précise - Trucs et astuces Express

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Copie de fichier à heure précise Quelques fonctions de PHP à imbriquer ?

#1 L'utilisateur est hors-ligne   Groumphy 

  • Modérateur loufoque et linuxien
  • Groupe : Modérateurs
  • Messages : 3144
  • Inscrit : 26-novembre 02

Posté 11 février 2010 - 10:10

Bonjour à tous et toutes,

Je pose ici un sujet que je ne maitrise pas trop: PHP.

Permettez-moi de vous soumettre le problème:
a) je dois copier un fichier texte se situant sur un autre serveur que le mien à des heures précises (00:31,02:01,03:31, etc. etc.) ;
B) ce fichier je dois le lire et générer un contenu HTML avec ce dit fichier ;

Voici donc le problème en synthétique.

Pour la partie a), je pense qu'il faut utiliser une fonction du style :
function copieFichier($Source, $Destination) {
    									$Fichier = fopen ($Source, "r");
										$ContenuFichier ='';
									    while (!feof($Fichier)) $ContenuFichier .= fread($Fichier, 8192);
    									fclose ($Fichier);
									    $Fichier = fopen ($Destination, "w+");
										if ( !fwrite($Fichier, $ContenuFichier)) die('Impossible d\'écrire dans le fichier');
										fclose ($Fichier); }

Que l'on trouve facilement sur le net...

L'exécution de cette fonction se fait en 2 morceaux:
- si le fichier en local sur le serveur n'existe pas ;
- si le fichier en local sur le serveur est "out of date" ;

Pour la première condition, je dirais c'est facile:
 // EFFACE CAR CODE NON CORRECT ==> Ne pas induire les autres en erreur...

Par contre pour la deuxième, je dois dire que je sèche un peu ; il faut donc procéder de la manière suivante:
structure du fichier TXT:
 // STRUCTURE NON REALISTE ==> EFFACE ==> Solution posé ci-dessous
(j'insiste que les lignes d'espace s'y trouve !!)
- j'ouvre mon fichier TXT, je lis le contenu et principalement la dernière ligne ;
- si cette dernière ligne est différente de mon heure (théoriquement fonction Date('H'); ??), je dois relancer la copie ;

Voila qui est assez sympa.
A partir de là, si je parviens à lire la 4ième ligne, je peux en déduire que je peux lire la première et donc générer du HTML (une fonction que je verrais par la suite).

Ma question est donc:
comment faire pour lire cette 4ième ligne de fichier texte local ?
comment faire pour capturer les heures et lancer donc la copie ?

Sauf erreur de ma part le plus gros est déjà fait... Mais j'ai horreur des puzzles quand je ne m'en sors pas. S'il y a bonne âme charitable pour me guider, ce sera absolument génial.

A vous lire,

G.
----------------------------------
Blog (Archives)
0

#2 L'utilisateur est hors-ligne   Webmaster 

  • Admin TAE
  • Groupe : Administrateurs
  • Messages : 7662
  • Inscrit : 21-septembre 01

Posté 11 février 2010 - 01:13

Chose certaine tu auras besoin d'une CronTask sur ton serveur pour exécuter la tâche à toute les heures, à moins que ce soit associer à un site très visité...

Sinon, la structure du fichier, je crois que tu pourrais y arriver avec les regexp, à l'analysé pour le décotirquer en fonction des <% et %> (d'ailleur pourquoi des <% %>, c'est rendu du ASP?) de sorte à les envoyer dans un array avec un index référenciel, comprendre un index du genre $tableau['indice_temp'] ...

Voit se lien, ça pourrait t'aider : http://www.roscripts...amples-136.html
1

#3 L'utilisateur est hors-ligne   Groumphy 

  • Modérateur loufoque et linuxien
  • Groupe : Modérateurs
  • Messages : 3144
  • Inscrit : 26-novembre 02

Posté 11 février 2010 - 02:46

Salut,

Concernant les cron task, malheureusement ce n'est pas possible. En effet, dans cette continuité c'est aussi le pourquoi je dois définir une structure conditionnelle en PHP... Et donc l'utilisation de la fonction Date avec l'argu 'H'. S'il y a présence de la concordance, je dois vérifier qu'il est ensuite inférieur à un tel nombre pour ne pas le recopier etc.

Et donc cela me semble un peu scabreux comme technique mais je dois tout réaliser en PHP et uniquement PHP...

Concernant le RegExp, je m'y attendais et le hic est que je coince sans cesse sur ce type de fonction. Pour le <% en effet c'est de l'ASP. Le fichier texte est généré par un site externe sur lequel je n'ai aucun contrôle.... et donc il faut faire avec.

G.
----------------------------------
Blog (Archives)
1

#4 L'utilisateur est hors-ligne   Webmaster 

  • Admin TAE
  • Groupe : Administrateurs
  • Messages : 7662
  • Inscrit : 21-septembre 01

Posté 11 février 2010 - 07:05

Wow... pas de Cron... alors il faut que le site soit bien visité pour que ça fonctionne... J'ai utiliser un truc du genre l'autre fois sur le site pour toute remettre dans la base de donnée plutot que dans des fichiers individuel... En 24 heures tout était transféré dans la base de données, je suis resté assez surpris de la rapidité :P

Sinon, mouais... c'est casse couille de toute faire ça en PHP... Pour la structure conditionnel, il te faudrais un index des copies précédentes, base de donnée, fichier texte avec l'heure de la dernière copie? Ça dépend de ce que tu peux utiliser...

Pour décortiquer le fichier ASP, la ça risque d'être une autre histoire... Je suis vraiment rouiller en regex moi même, faudrais voir... Faudrais commencer par supprimer les sauts de ligne inutile... ensuite on défait le fichier avec des regex et un preg_match ... Ensuite faudrais contruire le tableau avec la classe array ...

Ça me semble la façon la plus "simple" d'y parvenir...

Dommage que je n'ai pas le temps pour l'instant de regarder ça... Mais je vais essayer de prendre le temps demain pour le faire si je suis pas trop occupé au boulot.
1

#5 L'utilisateur est hors-ligne   Groumphy 

  • Modérateur loufoque et linuxien
  • Groupe : Modérateurs
  • Messages : 3144
  • Inscrit : 26-novembre 02

Posté 12 février 2010 - 05:43

Hello,

Aucune DB ou autre... Sinon ce serait trop simple.
Tout repose en fait sur le comparatif de l'heure locale (stockée dans le fichier...). Si l'heure dépasse alors on copie, sinon on ne fait rien... Et au vu que ce sera chargé sur la page, l'appel se fera en local. Zen quoi.

Je vois que toi aussi tu en chi*e pour le RegEx :)
Vais tenter de voir cela... Aussi ce WE :)
----------------------------------
Blog (Archives)
0

#6 L'utilisateur est hors-ligne   Groumphy 

  • Modérateur loufoque et linuxien
  • Groupe : Modérateurs
  • Messages : 3144
  • Inscrit : 26-novembre 02

Posté 12 février 2010 - 07:09

Re,

J'ai oublié de poster mon dernier avancement:
function copieFichier($Source, $Destination) {
 									$Fichier = fopen ($Source, "r");
										$ContenuFichier ='';
								 while (!feof($Fichier)) $ContenuFichier .= fread($Fichier, 8192);
 									fclose ($Fichier);
								 $Fichier = fopen ($Destination, "w+");
										if ( !fwrite($Fichier, $ContenuFichier)) die('Impossible d\'écrire dans le fichier');
										fclose ($Fichier); }
// Fonction verificationHeure
// 	ouvre le fichier
// 	lis le contenu du fichier

function verificationHeure() {
								// ouverture du fichier
								$handle = fopen($destinationFichier, 'r');
								// lecture du contenu du fichier
								//$contents = fread($handle, filesize($destinationFichier));
								$contenu = file_get_contents($destinationFichier);
								// affichage du contenu de la lecture 
								echo $contenu;
								// scinde la phrase grâce aux virgules et espacements
								// ce qui inclus les " ", \r, \t, \n et \f
								$ligne = preg_split("/[\s,]+/", $contenu);
								// fermeture du fichier
								//fclose($handle);
}						
function fichierExiste() {
	// structure conditionnelle pour vérifier la présence du fichier
	if (file_exists($destinationFichier)) {
		// le fichier existe
		verificationHeure();
	} else {
		// le fichier n'existe pas
		// je copie le fichier 
 copieFichier($fichierSource,$destinationFichier); 
 // faire appel à la fonction de traitement du fichier mais sans les heures
 verificationHeure();
 }
}

fichierExiste();


Par contre cela plante sans cesse... Ai pas encore eu le temps de débugger ... Il m'indique que ma ligne 30 (donc le foef de la fonction copie du fichier ne va pas :( )... Enfin je regarde ...
----------------------------------
Blog (Archives)
0

#7 L'utilisateur est hors-ligne   Groumphy 

  • Modérateur loufoque et linuxien
  • Groupe : Modérateurs
  • Messages : 3144
  • Inscrit : 26-novembre 02

Posté 12 février 2010 - 09:02

Cette fonction fonctionne:

function verificationHeure() {
								
								$handle = fopen('http://localhost/dynamic_index.txt', 'r');
								// lecture du contenu du fichier
								$contenu = file_get_contents('http://localhost/dynamic_index.txt');
								// affichage du contenu de la lecture 
								echo $contenu;
								fclose($handle);

Elle affiche

Citation

<% indice_global ="3"%> <% indice_trafic ="0"%> <% date_indice="12/02/2010"%> <% indice_temps= 12:00%>


... Zen, le plus dur commence à se faire :D
----------------------------------
Blog (Archives)
0

#8 L'utilisateur est hors-ligne   Groumphy 

  • Modérateur loufoque et linuxien
  • Groupe : Modérateurs
  • Messages : 3144
  • Inscrit : 26-novembre 02

Posté 12 février 2010 - 10:00

Bon, on peut arriver à quelque chose comme ceci:

// 	Fonction verificationHeure()
// 	paramètres: aucun
// 	La fonction fait: 
// 		ouvre le fichier
// 		lis le contenu du fichierExiste
// 		explose les différentes chaines pour extraire l'heure
//		fait un comparatif de l'heure fichier avec l'heure serveur (--> quid heure locale)
//		structure conditionnelle pour appel de fonction s'il faut faire quelque chose
//		ferme le fichier
// 	appel de la fonction: 
//		verificationHeure();
function verificationHeure() {
								// ouverture du fichier en lecture
								$handle = fopen('http://localhost/dynamic_index.txt', 'r');
								// lecture du contenu du fichier
								$contenu = file_get_contents('http://localhost/dynamic_index.txt');
								
								// scinde la phrase grâce aux virgules et espacements
								// ce qui inclus les " ", \r, \t, \n et \f
								// on obtient alors 11 "morceaux", le dernier contient les heures
								// impossible d'utiliser une autre fonction car le type de données 
								// n'est pas standard => no split(); 
								$keywords = preg_split("/[\s,]+/", $contenu);
								$monheurelocale = explode(":",$keywords[10]);
								// fermeture du fichier
								fclose($handle);
								If ($monheurelocale <> date('H')) {
									// copie le fichier
									} else {
									// ben je ne fais rien et je travaille avec mon fichier local
								
								}
}
// Fin de la fonction verificationHeure()


Faut espérer maintenant qu'ils ne changent pas la structure du fichier distant.

Petite question... Date('H') renvoie la date serveur ou la date client ?
----------------------------------
Blog (Archives)
0

#9 L'utilisateur est hors-ligne   Webmaster 

  • Admin TAE
  • Groupe : Administrateurs
  • Messages : 7662
  • Inscrit : 21-septembre 01

Posté 12 février 2010 - 02:56

date('H') renvoie l'heure du serveur ...

Et en passant, bonne chose que tu es pas utilisé split(), la fonction est deprecated :P
0

#10 L'utilisateur est hors-ligne   Groumphy 

  • Modérateur loufoque et linuxien
  • Groupe : Modérateurs
  • Messages : 3144
  • Inscrit : 26-novembre 02

Posté 13 février 2010 - 03:16

Mouais j'avais vu cela dans la doc de PHP... D'ailleurs RegEx aussi devient déprécié... D'où mon utilisation ici.

Bon autre petite question (fainéantise de fouiner).... Est-ce que PHP interprète les chaines de caractère de manière différentes (heure, numérique, etc.) ?
Je m'explique: au vu que je ne sais pas sur quel serveur va tourner ce script je dois voir pour faire correspondre le serveur du script avec l'heure du serveur distant. Donc je compte utiliser le résultat de date('H') et faire une somme ou une soustraction du nombre d'heure (ou encore spécifier cela dans la structure conditionnelle) ...

$monheure = date('H');
$monheurefichier = $monheurelocale; // le format est string => comparable au bit par bit

$monheure = $monheure + 2; // quel est le format ?? 


Tiens-moi informé,

Xavier
----------------------------------
Blog (Archives)
0

#11 L'utilisateur est hors-ligne   Groumphy 

  • Modérateur loufoque et linuxien
  • Groupe : Modérateurs
  • Messages : 3144
  • Inscrit : 26-novembre 02

Posté 13 février 2010 - 04:16

Hmm après un petit test, j'ai l'erreur suivante:

Citation

Warning: fopen(http://montest.mondo...namic_index.txt) [function.fopen]: failed to open stream: HTTP wrapper does not support writeable connections in /home/users/00/0b/14/home/www/OLD/fbaud/test-fb.php on line 32

Warning: fwrite(): supplied argument is not a valid stream resource in /home/users/00/0b/14/home/www/OLD/fbaud/test-fb.php on line 33
Impossible d'écrire dans le fichier


Ca pue le CHMOD mal distribué cela non ?
(heureusement ce ne sont pas des erreurs PHP :D )
----------------------------------
Blog (Archives)
0

#12 L'utilisateur est hors-ligne   Webmaster 

  • Admin TAE
  • Groupe : Administrateurs
  • Messages : 7662
  • Inscrit : 21-septembre 01

Posté 15 février 2010 - 07:37

Ouais ça sent le mauvais CHMOD ou un truc du genre.

Pour les Regex, ça m'étonnerais que ce soit deprecated, c'est surement juste quelque fonction qui sont remplacé par des nouvelles qui le deviennent... Car un langage de prog sans Regex... Retarded... lol

Sinon pour le truc de l'heure, je crois que tu peux utiliser mktime() de mémoire pour avoir une heure bassé sur un GMT précis...
0

#13 L'utilisateur est hors-ligne   Groumphy 

  • Modérateur loufoque et linuxien
  • Groupe : Modérateurs
  • Messages : 3144
  • Inscrit : 26-novembre 02

Posté 18 février 2010 - 10:42

Voici une partie de la solution, je recherche encore pour le restant:


	<?php
		// 	FONCTIONS
		// ====================================================================================================================================
		function obtenirIndexGlobal() {
			$fichier = 'http://localhost/dynamic_index.txt'; 							// adresse du fichier en local (serveur non distant)
			$contenu_string = file_get_contents($fichier); 					// obtenir le contenu du fichier
			$contenu_string_explo = explode("=",$contenu_string);			// explosion du contenu sur le signe "="
			If (!is_numeric(substr($contenu_string_explo[1],2,1))) {		// vérifie si le 2ième caractère est numérique
				return substr($contenu_string_explo[1],1,1); }				// non numérique ==> renvoie que le premier caractère
			else { return substr($contenu_string_explo[1],1,2); }			// numérique ==> renvoie les 2 caractères
		}
		function obtenirHeure() {
			$fichTxt = 'http://localhost/dynamic_index.txt';							// adresse du fichier en local
			$contenuStr = file_get_contents($fichTxt); 						// obtenir le contenu du fichier
			$contenuStrExplo = explode("=",$contenuStr);					// explosion du contenu sur le signe "="
																			// $contenuStrExplo[4]; contient une heure du format HH:MM
																			// les deux derniers caractères (pourcentage et >) sont à supprimer
			return trim($contenuStrExplo[4]," \r\n%>");						// suppression des espace, des retours chariots, des retour à la ligne 
																			// et des signes pourcentage et >
		}
		function fuseauHoraireServeur() {
			return date_default_timezone_get();								// ca.php.net/manual/fr/timezones.europe.php 
																			// ca.php.net/manual/fr/timezones.america.php
		} 	
	?>


Plus simple non ?
Bon maintenant je dois récupérer l'heure d'un fichier distant, calculer s'il y a différence entre le local et le distant... Faire une comparaison d'heure et copier le fichier si celui-ci rentre dans un fuseau horaire différents.
Allez zou... Les aides sont les bienvenues :)

G.
----------------------------------
Blog (Archives)
0

#14 L'utilisateur est hors-ligne   Groumphy 

  • Modérateur loufoque et linuxien
  • Groupe : Modérateurs
  • Messages : 3144
  • Inscrit : 26-novembre 02

Posté 17 juin 2010 - 09:47

Re à tous,

Je vous l'avais dit que j'allais trouver non ?
Et bien voila la solution: sur mon blog.
J'avais un peu oublié de mettre le suivi mais bon tout fonctionne !

A+

G.
----------------------------------
Blog (Archives)
0

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet


annuaire