Tester l'existance d'un fichier sur un montage

Tester l'existance d'un fichier sur un montage - PHP - Programmation

Marsh Posté le 16-07-2010 à 14:20:36    

Bonjour,
Dans le cadre de mon appli web Astres(cf signature), j'ai besoin de tester l'existence de fichiers situés sur un montage samba ou d'url. J'ai trouvé une méthode qui marche pour les 2 :

Code :
  1. function remote_file_exists($url)
  2. {
  3.     $head = "";
  4.     $url_p = parse_url ($url);
  5.  
  6.     if (isset ($url_p["host"]))
  7.     {
  8.         $host = $url_p["host"];
  9.     }
  10.     else
  11.     {
  12.         return 1;
  13.     }
  14.  
  15.     if (isset ($url_p["path"]))
  16.     {
  17.         $path = $url_p["path"];
  18.     }
  19.     else
  20.     {
  21.         $path = "";
  22.     }
  23.  
  24.     $fp = @fsockopen ($host, 80, $errno, $errstr, 20);
  25.     if (!$fp)
  26.     {
  27.         return 2;
  28.     }
  29.     else
  30.     {
  31.         $parse = parse_url($url);
  32.         $host = $parse['host'];
  33.  
  34.         fputs($fp, "HEAD ".$url." HTTP/1.1\r\n" );
  35.         fputs($fp, "HOST: ".$host."\r\n" );
  36.         fputs($fp, "Connection: close\r\n\r\n" );
  37.         $headers = "";
  38.         while (!feof ($fp))
  39.         {
  40.             $headers .= fgets ($fp, 128);
  41.         }
  42.     }
  43.  
  44.     fclose ($fp);
  45.     $arr_headers = explode("\n", $headers);
  46.     $return = false;
  47.     if (isset ($arr_headers[0]))
  48.     {
  49.         $return = strpos ($arr_headers[0], "404" ) === false;
  50.     }
  51.  
  52.     return $return;
  53. }


 
Ca marche bien sauf que des fois, la fonction bloque pendant 3 plombes et j'ai beau jouer sur le paramètre de timeout (ici, il est à 20s, j'ai testé avec 1s voire 0.1s), ça ne change rien  :heink:  
 
Du coup, est-ce que vous connaitriez une autre façon de procéder?
 
Merci :)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 16-07-2010 à 14:20:36   

Reply

Marsh Posté le 16-07-2010 à 14:37:07    

pourquoi t'utilises pas get_headers ?

Reply

Marsh Posté le 16-07-2010 à 15:39:12    

On va dire parce que je suis un âne  :whistle:  
 
Mais bon, ça va pas résoudre mon pb. C'est pas ma fonction qui merde, je me suis rendu compte en poussant les tests que ce certaines urls que je donne à ma fonction qui merdent. Quand je les mets dans Firefox, il mouline 30 secondes et puis rien : pas de msg d'erreur, rien :/
 
Une url, elle amrche ou pas, mais elle est pas censée mettre 30s pour se décider  :pt1cable:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 16-07-2010 à 15:45:54    

si justement, le serveur peu être long a répondre donc le client attend jusqu'à ce qu'il excède le temps max,
tu peu réduire le temps (2sec par exemple) mais bon tu saura pas vraiement si il a été long a répondre ou si il n'existe pas


Message édité par stealth35 le 16-07-2010 à 15:47:29
Reply

Marsh Posté le 16-07-2010 à 15:58:47    

Comment je peux réduire le temps? Parce qu'avec fsockopen(), le paramètre timeout n'a aucun effet :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 16-07-2010 à 16:08:48    

essaye de changer ton default_socket_timeout

Reply

Marsh Posté le 16-07-2010 à 17:02:10    

j'ai essayé avec get_headers(), mais j'arrive pas à systématiquement à discriminer des url ok et des NOK. Des fois, j'ai un code 200 OK pour des urls qui moulinent pendant 30s et où je n'arrive pas à avoir accès au contenu :/
 
Et après d'autres tests, ma fonction ne mouline plus sur des urls où elle devrait alors que j'ai touché à rien :??: Je comprends plus rien  :pt1cable:
 
EDIT : J'ai regardé du côté de stream_set_timeout() et stream_get_meta_data(), mais rien de concluant.


Message édité par rufo le 19-07-2010 à 09:30:49

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 16-07-2010 à 17:30:48    

curl ?


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 16-07-2010 à 22:23:00    

J'ai eu un problème similaire il y a quelques jours, j'avais une boucle infinie (ta ligne 38).

 

C'est un problème connu de feof et fsockopen http://php.net/manual/fr/function.feof.php

 

Peut-être que ton problème vient de là également?


Message édité par jeff@be le 16-07-2010 à 22:23:38
Reply

Marsh Posté le 19-07-2010 à 09:32:30    

merci pour l'info, je vais regarder ça. Mais ce qui me trouble comme dit dans mon précédent post, c'est que des url sur lesquelles ma fonction mettait 3 plombes, 1h après, ça ne le faisait plus :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 19-07-2010 à 09:32:30   

Reply

Marsh Posté le 19-07-2010 à 10:12:25    

Bon, en fait, c'était bien un pb de conf du côté du serveur sur lequel je vérifiait l'existence de certaines urls.
Mais bon, ce topic aura pas été inutile, j'aurai découvert get_headers() et que feof() avait un bug et qu'il existait une solution, ça pourra toujours resservir :)
Merci du coup de main en tout cas :jap:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed