Tester l'existance d'un fichier situé sur un répertoire monté

Tester l'existance d'un fichier situé sur un répertoire monté - PHP - Programmation

Marsh Posté le 19-12-2008 à 10:11:41    

Bonjour,
Sur un serveur sous Linux, j'ai une appli web en PHP qui, entre autre, gère des fiches documentaires dans une BD MySQL. L'un des champs de chaque fiche contient le chemin du fichier sous la forme http://NomDuServeur/NomRépertoireMonté/Chemin.../NomFichier.ext où NomRépertoireMonté correspond à un répertoire situé sur un autre serveur (Windows) qui a été monté sur le serveur via Samba.
 
Je voudrais faire un script qui vérifie que le fichier existe bien sur ce répertoire monté, afin de détecter les liens morts. J'ai essayé avec :
1) file_exists() mais ça me dit à chaque fois que le fichier n'existe pas alors que ce n'est pas vrai,
2) fopen() et dans le php.ini, allow_url_fopen = on et Registered PHP Streams = php, file, data, http, ftp, mais j'ai un message d'erreur comme quoi il: n'arrive pas à ouvrir le flux http,
3) la lib Snoopy, ça marche en partie mais que pour détecter des chemins vraiment foireux (qui ne commencent pas par http, par ex)
 
Auriez vous une explication de pourquoi fopen ne marche pas alors que ça devrait? 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 19-12-2008 à 10:11:41   

Reply

Marsh Posté le 19-12-2008 à 11:11:22    

bon, avec Snoopy, j'ai progressé et ça marche a priori comme je veux, sauf que ma base ayant plusieurs milliers d'enregistrements, le script plante avec un message d'erreur relatif à de l'allocation mémoire :(
 
[size=0]Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 500001 bytes)[/size]


Message édité par rufo le 19-12-2008 à 11:13:18

---------------
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-12-2008 à 12:27:19    

Bah augmente le memory_limit [:petrus75]

Reply

Marsh Posté le 19-12-2008 à 12:30:47    

FlorentG a écrit :

Bah augmente le memory_limit [:petrus75]


Pas forcement il lui dis qu'il peut pas allouer un espace ridicule alors qu'il ne dépasse pas la limite cela doit venir d'autre chose une mauvaise utilisation


---------------
Recette cookeo Recette de cuisine
Reply

Marsh Posté le 19-12-2008 à 13:04:43    

En gros, je fais  

Code :
  1. $snoopy = new Snoopy;
  2.  
  3. while ($Record = $DbResult->fetchRow(DB_FETCHMODE_ASSOC)) {
  4.    $Url = $Record["DocumentLocation"];
  5.  
  6.    $snoopy->fetch(str_replace(array(" ", "/'" ), array("%20", "'" ), $Url));
  7.    if (strpos($snoopy->headers[0], '404') !== FALSE) {
  8.        ...
  9.    }
  10. }
  11. unset($snoopy);


 
la ligne qui plante est une ligne qui contient un fread() dans la lib Snoopy. En fait, je pense pas que ça soit dû à mon while qui aurait trop d'enregistrements à parcourir mais au fait que la lib Snoopy ouvre et charge en mémoire à chaque fois le contenu du fichier dont je veux tester l'existence. :/


---------------
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-12-2008 à 13:05:29    

j'ai essayé aussi en mettant le new et le unset à l'intérieur du while, j'ai le même pb.


---------------
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-12-2008 à 14:10:38    

J'ai trouvé un script pas mal qui est bien plus rapide et qui n'a pas de pb de mémoire :

Code :
  1. <?php
  2. function remote_file_exists ($url)
  3. {
  4. /*
  5.    Return error codes:
  6.    1 = Invalid URL host
  7.    2 = Unable to connect to remote host
  8. */ 
  9.    $head = "";
  10.    $url_p = parse_url ($url);
  11.  
  12.    if (isset ($url_p["host"]))
  13.    { $host = $url_p["host"]; }
  14.    else
  15.    { return 1; }
  16.  
  17.    if (isset ($url_p["path"]))
  18.    { $path = $url_p["path"]; }
  19.    else
  20.    { $path = ""; }
  21.  
  22.    $fp = fsockopen ($host, 80, $errno, $errstr, 20);
  23.    if (!$fp)
  24.    { return 2; }
  25.    else
  26.    {
  27.        $parse = parse_url($url);
  28.        $host = $parse['host'];
  29.      
  30.        fputs($fp, "HEAD ".$url." HTTP/1.1\r\n" );
  31.        fputs($fp, "HOST: ".$host."\r\n" );
  32.        fputs($fp, "Connection: close\r\n\r\n" );
  33.        $headers = "";
  34.        while (!feof ($fp))
  35.        { $headers .= fgets ($fp, 128); }
  36.    }
  37.    fclose ($fp);
  38.    $arr_headers = explode("\n", $headers);
  39.    $return = false;
  40.    if (isset ($arr_headers[0]))
  41.    { $return = strpos ($arr_headers[0], "404" ) === false; }
  42.    return $return;
  43. }
  44. /* utilisation */
  45. $url = "http://www.google.it/intl/it_it/images/logo.gif";
  46. if (remote_file_exists ($url))
  47. { print ($url . " file exists!" ); }
  48. else
  49. { print ($url . " file doesn't exist!" ); }
  50. ?>


---------------
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