Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONNAITRE L'EXISTANCE D'UN FICHIER SUR UN SERVEUR HTTP EXTERNE


Information sur la source

Catégorie :Réseau & Internet Classé sous : socket, fsock, preg, fichier, http Niveau : Débutant Date de création : 05/10/2007 Date de mise à jour : 05/10/2007 23:52:09 Vu : 3 745

Note :
Aucune note

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Description

Bonjour à tous.
(Nota : Je n'ai pas trouvé de fonctions similaires, si c'est le cas, veuillez m'en excuser)

L'idée, c'est de tester l'existence d'un fichier sur un serveur http afin de l'ouvrir apres.
En effet, si vous faites un fopen ('http://www.domain.tld/mon_fichier.xml', 'r'); et que le fichier n'existe pas, la fonction fopen va tourner pendant toute la durée du Max Execution Time.
Afin de ne pas perdre de temps, j'ai fait une petite fonction qui permet de retourner un boolean disant si le fichier demandé existe.

Voila la source :
 

Source

  • <?php
  • function online_file_exist ($sUrl, $iPort = 80) {
  • if (!is_string ($sUrl)) { // Si le premier paramètre n'est pas un String
  • die ('Invalide paramètre. Le premier paramètre doit être un String');
  • // ou throw new exception ('...'); au choix
  • }
  • else if (!is_int ($iPort)) { // Si le second paramètre n'est pas un entier
  • die ('Invalide paramètre. Le second paramètre doit être un entier');
  • // ou throw new exception ('...'); au choix
  • }
  • else { // Sinon
  • // On récupere la valeur du serveur
  • preg_match ('#\/\/(.*)\/(.*)#', $sUrl, $sUrlInfo);
  • // Le Serveur
  • $sServerName = $sUrlInfo[1];
  • // Le fichier demandé
  • $sFilePath = $sUrlInfo[2];
  • // On ouvre le socket
  • if (($rSock = @fsockopen($sServerName, $iPort)) === false) {
  • die ('Impossible d\'ouvrir '.$sServerName.'. Le server n\'est pas accessible');
  • // ou throw new exception ('...'); au choix
  • }
  • // On envoie la requete de demande de fichier
  • $sRequest = 'GET /'.$sFilePath.' HTTP/1.1'."\r\n";
  • $sRequest .= 'Host: '.$sServerName."\r\n";
  • $sRequest .= 'Connection: Close'."\r\n\r\n";
  • if (!@fwrite ($rSock, $sRequest)) {
  • die ('Impossible d\'envoyer la requête !');
  • // ou throw new exception ('...'); au choix
  • }
  • // On récupere la réponse
  • $sHttpResponse = @fgets($rSock, 128);
  • // et on ferme la resource
  • @fclose($rSock);
  • // Si la réponse est bonne (200), alors on retourne true, sinon false;
  • if (strpos ($sHttpResponse, '200') !== false)
  • return true;
  • else
  • return false;
  • }
  • }
  • ?>
<?php
function online_file_exist ($sUrl, $iPort = 80) {
	if (!is_string ($sUrl)) { // Si le premier paramètre n'est pas un String
		die ('Invalide paramètre. Le premier paramètre doit être un String');
		// ou throw new exception ('...'); au choix
	}
	else if (!is_int ($iPort)) { // Si le second paramètre n'est pas un entier
		die ('Invalide paramètre. Le second paramètre doit être un entier');
		// ou throw new exception ('...'); au choix
	}
	else { // Sinon
		// On récupere la valeur du serveur
		preg_match ('#\/\/(.*)\/(.*)#', $sUrl, $sUrlInfo);
		
		// Le Serveur
		$sServerName = $sUrlInfo[1];

		// Le fichier demandé
		$sFilePath = $sUrlInfo[2];

		// On ouvre le socket
		if (($rSock = @fsockopen($sServerName, $iPort)) === false) {
			die ('Impossible d\'ouvrir '.$sServerName.'. Le server n\'est pas accessible');
			// ou throw new exception ('...'); au choix
		}

		// On envoie la requete de demande de fichier
		$sRequest = 'GET /'.$sFilePath.' HTTP/1.1'."\r\n";
		$sRequest .= 'Host: '.$sServerName."\r\n";
		$sRequest .= 'Connection: Close'."\r\n\r\n";
	
		if (!@fwrite ($rSock, $sRequest)) {
			die ('Impossible d\'envoyer la requête !');
			// ou throw new exception ('...'); au choix
		}

		// On récupere la réponse
		$sHttpResponse = @fgets($rSock, 128);
		// et on ferme la resource
		@fclose($rSock);

		// Si la réponse est bonne (200), alors on retourne true, sinon false;
		if (strpos ($sHttpResponse, '200') !== false)
			return true;
		else
			return false;
	}
}
?>

Conclusion

Note :
Vous devez avoir les sockets d'activés pour utiliser cette fonction !

Après je suis ouvert à toute proposition de fonction existant déjà (:/ lol), ou plus performante :)
 

Historique

05 octobre 2007 14:23:20 :
Rajout des tags <?php ?> dans le code :p
05 octobre 2007 14:24:56 :
Modification du titre
05 octobre 2007 23:52:09 :
Suppression des returns inutiles

Commentaires et avis

signaler à un administrateur
Commentaire de Teclis01 le 05/10/2007 18:39:41

C'est pas plus simple comme ceci ?

$sFile='monfichier';
$mContent=@file_get_content($sUrl);
if($mContent!==false){
   file_put_content($sFile,$sContent);
}

signaler à un administrateur
Commentaire de malalam le 05/10/2007 20:16:26 administrateur CS

BEGIN @TROLL
Le teclis qui parle de la simplicité d'un code, je rêve...
END @TROLL

Sinon, Alex, file_get_contents($sUrl) ne passera pas dans tous les cas, selon la config du serveur? Voire même dans peu de cas si on n'a pas la main sur le serveur. Les sockets sont le meilleur moyen.

Ceci mis à part, die()...return false ? Ah.
T'as peur que le die()...meure prématurément...?
En tous cas bien pour le throw new Exception au choix, j'ai fait mon choix ;-)
Rien de spécial à dire sur le code sinon, sauf que je l'aurais plus vu dans les snippets de codyx.org, mais bon.

signaler à un administrateur
Commentaire de codefalse le 05/10/2007 23:50:35 administrateur CS

j'y ai pensé pour les snippets mais j'était pas sur.
Je le rajoute ?
(et oué perso, je préfere aussi les exceptions :p)

Pour le return false apres un die ... ché pa, histoire de ralonger le code ? ;)

signaler à un administrateur
Commentaire de Teclis01 le 07/10/2007 00:47:20

BEGIN; TROLL;
mais euuuh >_<
COMMIT; TROLL

Ah bah je savais pas ça ^^ je venais juste de faire un script rapidos utilisant ces 2 fonctions du coup quand j'ai vu le titre j'ai regardé et j'ai posté (avec peu de verifs ) :)

Qu'entends tu par avoir la main sur le serveur ?

signaler à un administrateur
Commentaire de malalam le 07/10/2007 01:16:33 administrateur CS

Ben tu prends ta main droite (ou gauche, ça dépend) et tu la poses sur le serveur, bien à plat, il faut que la paume touche le métal; et là...
...

J'entends par là : pouvoir le configurer.
Par défaut, bien souvent, file_get_contents() ne sera pas autorisé à ouvrir des url, mais uniquement des fichiers locaux au serveur.

signaler à un administrateur
Commentaire de coucou747 le 07/10/2007 02:56:48

Par défaut, bien souvent...

t'as une contradiction ici... ou une forme ambigue... en effet, par defaut ou ? sur quelle install de php ? sur quel hebergeur ?

bref, perso, j'ai pas ce genre de restrictions...

signaler à un administrateur
Commentaire de Teclis01 le 07/10/2007 23:29:21

Mais il se fou de moi en plus !!! >_<
ok je ne savais pas que ce genre de droit etait de manière générale non authorisé. Merci de l'info :)

signaler à un administrateur
Commentaire de coucou747 le 07/10/2007 23:34:30

teclis01, les conseils de malalam sont souvent d'un grand secours...

moi je prefere largement le fsock, il est plus souple, il permet :
- de faire suivre des cookies
- de poster
- de recuperer diverses informations donnees par le serveur (signature, etc...)
- de mieux gerer l'entete

signaler à un administrateur
Commentaire de coucou747 le 07/10/2007 23:35:39

Oh, un oubli... desole... pour eviter de me faire insulter dans un lamentable troll comme on en a vu parfois ici... j'ai la mauvaise habitude de nommer la fonction fsockopen fsock... pardonnez moi cette meprise, cet abus de langage, ou ce crime contre le php (rayez la mention inutile...)

signaler à un administrateur
Commentaire de Zephyr11 le 03/12/2007 12:18:10

Toujours aussi débutant, mais comme la "classe de vérif de formulaire", ce code tombe à point nommé, merci !

signaler à un administrateur
Commentaire de codefalse le 03/12/2007 12:57:36 administrateur CS

merci à toi :)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

upload fichier socket [ par yvesyves ] Bonjour,Je m'explique en tant que passagé car je programme pas en php mais je le comprend :J'ai 2 formulaires html avec un bouton submit et un champ d protections de fichiers derriere allopass [ par seabird ] Bonjour, Je suis actuellement en train de faire le site d'un groupe de musique sur lequel les morceaux seront vendus derriere allopass. j'utilise donc insertion failed [ par vinz78 ] &lt;?php$nomlabo=$HTTP_POST_VARS['Nomlab'];$idlabo=$HTTP_POST_VARS['id_labo'];$nomcont=$HTTP_POST_VARS['nom_cont'];$telephonecont=$HTTP_POST_VARS['tel PHP et fichier Word [ par Kirostaz ] Bonjour à tous, alors je vous présente la situation :- j'ai un formulaire dans lequel on rentre entre autre un nom de rapport et un nom de fichier qu' connexion HTTP download [ par amin127 ] Bonjour, Je suis un debutant en programmation php. Et je suis actuellement entrain de monter un system de partage de fichier. Je m'explique.Supposon envoi de pi??ce jointe par mail [ par arnold002 ] Bonjour &#168;&#164; tous,J'ai un gros probl&#168;&#168;me pour envoyer une pi&#168;&#168;ce jointe par email.Voici mon code : &lt;?php$bouton <FONT c Lire des données d'un fichier rdf [ par tibine974 ] Bonjour/Bonsoir à tous et toutes !Voilà je veux lire certaines données d'un fichier rdf, mais je bloque, si quelqu'un pouvait m'aider svp !Fichier rdf Question templates [ par astuces_jeux ] Bonjour,J'ai remarqué que l'utilisation de la class fasttemplate est compliquée. Alors je voulais savoir si on ne pouvait pas faire ça simple : foncti requete HTTP : echec de socket_read() [ par supers03 ] Bonjour à tousJ'utilise depuis un certain temps un même script pour envoyer/recevoir des requêtes HTTP (socket_create, conenct, write, etc...) jusqu'à suprimer les doublon d'un fichier texte [ par marco2003 ] Bonjour ,Je suis debutant et j'aurais besoin de suprimer le doublons d'un fichier texte  sur mon serveur .les fichier a la forme suivante :http://le-c


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,608 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.