[PHP] Test de la présence d'un fichier distant avec is_file

Xav_

Expert
Salut à tous,

Voilà, je m'occupe du site de mon asso de gamers (Media-Lan), et nous parrainons une ligue (Chaos Lan).
Je voulais afficher sur le site de Media-Lan, des infos du site chaos-lan, ce qui marche plutot bien avec le script suivant que j'ai fait (c'est pas les vrais adresse et nom de fichier):
[cpp]<?
$path="http://www.toto.com/chaoslan/";
$file="stat.php";

$chaos=fopen($path.$file,"r");
$info_chaos=fgets($chaos, 4096);
fclose($chaos);

if (strlen($info_chaos)>0)
{
$info_chaos=explode('<br>', $info_chaos);
$equipe=$info_chaos[0];
$coach=$info_chaos[1];
$match=$info_chaos[2];
echo "<img src='Images/chaoslanpiti.gif'>";
echo $equipe."gérées par ".$coach."avec déjà ".$match;
}
?>[/cpp]

Mais j'aimerais en plus rajouter un test avant le fopen pour vérifier que le fichier est là et ne pas me ramasser un gros message d'erreur dans le cas contraire.
J'ai donc tenté un is_file($path.$file) avant mon fopen, mais avec ça, il me répond FALSE (fichier inexistant) à chaque fois... alors que si je test pas, il trouve le fichier et tout se déroule bien.

Est-il possible avec un is_file de connaitre l'existence d'un fichier distant (ce que j'essai de faire), sinon avec qu'elle commande je peux le faire ???

Merci à ceux qui ont eu le courage de tout lire, merci d'avance à ceux qui vont répondre, et.... rien pour les autres ;)

EDIT:
le fichier stat.php se présente comme suis et n'est destiné qu'à la lecture par le site media-lan:
[cpp]
// connexion à la base et récup des infos
echo $equipe." équipes<br>";
echo $coach." coach<br>";
echo $match." match joués";
[/cpp]
 

KangOl

Grand Maître
au fait non, is_file ne peut pas tester l'existance d'un fichier distant.
par contre dans les commentaires de cette fonction sur php.net (ou de file_exist je sais plus), quelqu'un a proposer sa prope fonction : remote_file_exist.
 

Xav_

Expert
je vais jetter un oeil la-dessus et je vous tiens au courant...

Merci de ta réponse KangOl :D
 

Xav_

Expert
nickel, j'ai effectivement trouvé un script d'une fonction "maison": remote_file_exist
Elle est bien dans le manuel PHP, en exemple de la fonction file_exist, et elle marche nickel.

C'est basé sur un fsockopen sur l'URL du fichier en question, ça te permet de savoir si une URL existe, et ça gère les différents cas d'erreur.

--> pb résolu, merci KangOl
 

KangOl

Grand Maître
le problème, c'est quelle prend pas mal de temps a s'exécuter, ce qui n'est pas top si on doit l'utiliser souvent...
 

Xav_

Expert
dans mon cas les infos sont affichées dans un cadre du menu et n'ont pas besoin d'etre rafraichi très souvent --> j'ai déclaré une variable de session pour n'effectuer la récup d'info qu'une fois par session
après je réaffiche mes valeurs tout le temps sans retourner lire.
 

KangOl

Grand Maître
Un gars m'a demandé sur ICQ ou il pourrait trouver cette fonction.
Apparement elle ne se trouve plus dans les commentaire de php. Cependant, on la trouve toujours sur d'autre sites avec google. puisque le net est assez volatile, je reposte le code ici
Code:
<?php
function remote_file_exists ($url)
{

/*
   Return error codes:
   1 = Invalid URL host
   2 = Unable to connect to remote host
*/   

   $head = "";
   $url_p = parse_url ($url);
  
   if (isset ($url_p["host"]))
   { $host = $url_p["host"]; }
   else
   { return 1; }
  
   if (isset ($url_p["path"]))
   { $path = $url_p["path"]; }
   else
   { $path = ""; }
  
   $fp = fsockopen ($host, 80, $errno, $errstr, 20);
   if (!$fp)
   { return 2; }
   else
   {
       $parse = parse_url($url);
       $host = $parse['host'];
      
       fputs($fp, "HEAD ".$url." HTTP/1.1\r\n");
       fputs($fp, "HOST: ".$host."\r\n");
       fputs($fp, "Connection: close\r\n\r\n");
       $headers = "";
       while (!feof ($fp))
       { $headers .= fgets ($fp, 128); }
   }
   fclose ($fp);
   $arr_headers = explode("\n", $headers);
   $return = false;
   if (isset ($arr_headers[0]))
   { $return = strpos ($arr_headers[0], "404") === false; }
   return $return;
}

/* utilisation */
$url = "http://www.google.it/intl/it_it/images/logo.gif";
if (remote_file_exists ($url))
{ print ($url . " file exists!"); }
else
{ print ($url . " file doesn't exist!"); }
?>
source :

cependant, au cours de mes recherches sur google, je suis tomber sur une autre fonction. Je ne l'ai pas tester mais elle devrait logiquement fonctionner. attention certains hebergeur desactivent la fonction ini_set ce qui empechera cette fonction de fonctionner...
Code:
// remote_file_exists-function
// ---------------------------
function remote_file_exists ($url)
{
    ini_set('allow_url_fopen', '1');
    if (@fclose(@fopen($url, 'r'))) {
        return true;
    } else {
        return false;
    }
}
source :
 

gabyweb

Nouveau membre
je suis le mec sur icq ;) merci pour la reponse KangOl :D

En fait apres avoir essayé la fonction j'ai l'impression qu'elle ne fonctionne pas pour ce que j'aimerais faire ...

Je m'explique, en fait j'aimerais tester la validité d'un lien style : mms://vipmms.canalplus.fr/canalplus/guignols_050321_a.wmv
ce dernier est valide, mais le lien mms://vipmms.canalplus.fr/canalplus/guignols_a.wmv ne l'est pas par ex, hors dans les 2 cas, il a l'air de trouver un fichier, mais dans le cas du 2eme, le fichier (inexistant) n'est pas exploitable (normal ...).
Tout ceci est un peu confu, j'espere que qqn comprendra mon pb ;)
J'aimerais donc savoir s'il existe un moyen de verifier que tel ou tel lien est valide ou non ?

Merci d'avance.

P.S. : mon server est sous php 4.1.2 (Debian GNU/Linux stable)
 

lol51

Habitué


Lol c'est drole, je cherche exactement la même chose.

En fait, il faudrait changer le user-agent pour que le serveur mms puisse nous faire telecharger le fichier. Mais alors, aucune idée pour realiser ca :??:
 

lol51

Habitué


EDIT : Ca y est, j'ai trouvé :D

ini_set ('user_agent', 'NSPlayer/9.0.0.2980');

Et ca marche !
 

Phoenix2006

Nouveau membre
On peut savoir comment tu a fait pour vérifier si le fichier mms/wmv existe sur le serveur distant ?
Moi la fonction me retourne 0 ?
 

boub popsyteam

Grand Maître
Qu'est ce que renvoie le serveur distant si le fichier n'existe pas ?
 

kanaziwok

Nouveau membre
non c'est bon j'avais fait une merde avec mon aray :s
j'avais oublié une variable donc il testé le domaine et pas le fichier lool ... quel boulz je suis lol
 

batchy

Grand Maître
mais le plus simple ne serait pas de tester la valeur de sortie de fopen ?
 

SamBeckett

Nouveau membre




Idem c'est exactement ce que je cherche à faire... bizarre, vous travaillez sur quoi ? pour faire quoi ? En ce qui me concerne c'est pour mettre à jour mon module Netvibes :

J'ai testé les 2 fonctions, je préfère la deuxieme qui est plus light dans le code et bien plus rapide à executer mais les 2 ne me donnent pas le bon résultat ! même en changeant le user-agent... où faut t il le mettre dans la fonction ?

 

lol51

Habitué


Salut,
en se qui me concerne j'avais fait un script pour générer des liens directs vers les videos des guignols :

Code:
<?php

ini_set ('user_agent', 'NSPlayer/9.0.0.2980');

function remote_file_exists ($url)

{

    ini_set('allow_url_fopen', '1');

    if (@fclose(@fopen($url, 'r'))) {

        return true;

    } else {

        return false;

    }

}



$urlbase = "http://";



$jour = date("d");

$mois = date("m");

$an = date("y");

for($boucle=0 ; $boucle!=15 ; $boucle++)

	{

	

	if(strlen($jour)<2)

	{

   	$jour=substr("0".$jour,-2);

	}

	else {}

	$uRl='http://vipmms.canalplus.fr/canalplus/guignols_'.$an.$mois.$jour.'_a.wmv';



if (remote_file_exists($uRl)=='true') 

{

	echo $jour.' ';

	echo '<a href="'.$uRl.'">	lien disponible<br /></a>';

}

else{

	echo $jour.' ';

	echo '<a href="'.$uRl.'">	lien mort</a><br />';

}





	if($jour>=2)

		{

		$jour = $jour-1;

		}

	else{

		$mois=$mois-1;

		$mois=substr("0".$mois,-2);

		$jour=31;

		}

	}

?>
Voilà.. si ça peut servir à quelqu'un plus tard, en l'adaptant un peu !
 

antoineklein

Nouveau membre
bonjour,

j'utilise la fonction :

ini_set('allow_url_fopen', '1');
if (@fclose(@fopen($url, 'r'))) {
return true;
} else {
return false;
}


et j'ai un truc bisarre, je télécharge un 1er fichier : test_3_m.jpg
pas de soucis, le fichier n'existe pas encore donc le téléchargement se fait

je vais pour télécharger un autre fichier : test_5_m.jpg

et là la fonction me dit que le fichier existe deja, comme si il ne faisait pas la différence entre le 3 et le 5 !!!!

si je fait la meme chose mais en renomant le fichier : test_5_m.jpg en test_55_m.jpg = ca marche !!!!

avez vous déjà eu ca ? comment le corriger ?
test_5_m.jpg
 

marsien

Grand Maître
Puisque tu es dans ce topic, pourquoi tu n'utilises pas la fonction is_file, prévue à cet effet, plutôt que ton truc bizarre ?
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 000
Membres
1 586 387
Dernier membre
ouistititouille
Partager cette page
Haut