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

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

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.