Connaitre l'existance d'un fichier sur un serveur http externe

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 998 fois - Téléchargée 17 fois

Contenu du snippet

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 / Exemple :


<?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 :)

A voir également

Ajouter un commentaire

Commentaires

Teclis01
Messages postés
1423
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
29 décembre 2012
4 -
C'est pas plus simple comme ceci ?

$sFile='monfichier';
$mContent=@file_get_content($sUrl);
if($mContent!==false){
file_put_content($sFile,$sContent);
}
malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
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.
codefalse
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
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 ? ;)
Teclis01
Messages postés
1423
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
29 décembre 2012
4 -
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 ?
malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
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.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.