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