verif presence de fichier par protocole HTTP

Eléphant du PHP | 254 Messages

18 mars 2006, 20:32

salut,


je cherche un systeme simple qui va me permettre de verifier l'existence d'un fichier en utilisant le protocole HTTP, ex :
$blTest = testPresenceFichierParHttp('http://localhost/_progPHP/gd2/image/source.png');
echo toAff($blTest);
jusqu'a maintenant j'utilisais ma classe Socket mais dans ce cas je dois trouver une autre soluce et je coince a trouver un systeme qui soit pas trop lourd pour le test de presence d'un grand nombre de fichiers.

avec PHP 5.00 je peux utiliser les fonctions de fichiers, ex :
$blTest = (bool)fopen('http://localhost/_progPHP/gd2/image/source.png','r');
echo toAff($blTest);
mais c'est trop lourd si je dois verifier 1000 fichiers sur un serveur lent depuis un serveur lent .... :?

de plus je n'arrive pas a utiliser les file_exists() is_file() is_readeable() .... etc avec le protocole HTTP :cry:
c'est moi qui merde ou qui ne sais pas lire la DOC ?

quelqu'un aurait une autre idée ?
n'importe laquelle ...

pour infos :
allow_url_fopen = On

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

18 mars 2006, 22:10

Pareil que , méthode HEAD soit par cURL soit en ouvrant un socket comme un grand. Si tu cherches les meilleures perfs, le mieux serait d'ouvrir un socket et gérer toi-même les requêtes/réponses, le tout en keep-alive. C'est plus long à programmer et tu dois gérer toi-même les erreurs (timeouts, etc...) mais c'est le plus efficace. Pas de liens désolé, je te laisse Googler les termes techniques ;)

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

18 mars 2006, 22:18

Avantage supplémentaires des sockets "à la main", c'est de pouvoir exécuter plusieurs requêtes en parralèle avec plusieurs sockets "non-bloquant": tu ouvres N sockets et crées une boucle infinie. Au début de la boucle tu vérifies le status de chaque socket:
  • libre - exécuter une requête, eg "HEAD /fichier1.ext" (le fichier provient d'une liste quelconque, par exemple array_pop($fichiers)). Si la liste est vide, fermer le socket
  • en attente - continuer
  • reçu réponse: traiter la réponse ("200 OK" le fichier existe, "404 Not found" il n'existe pas, et plein d'autres cas de figures d'après la RFC 2616)
Inutile de préciser que le script complet serait relativement long et nécessite un débogage très minutieux. Si le jeu n'en vaut pas la chandelle, regarde du côté de PEAR, il doit y avoir une classe pour ça.

Eléphant du PHP | 254 Messages

19 mars 2006, 00:23

comme precisé dans mon sujet : "jusqu'a maintenant j'utilisais ma classe Socket mais dans ce cas je dois trouver une autre soluce"

j'ai fait quelques tests dans une boucle x1000 avec fsockopen() et j'obtient le meme resultat qu'avec fopen() ce qui est logique puisque le moteur zend doit utilisé le meme code pour les connexions par le protocole HTTP.


la question portait surtout sur : est ce que les fonctions -> file_exists() is_file() is_readable() fonctionnent pour verifier des fichiers a distance ?

tous les tests me renvoient FALSE malgre la presence du fichier !

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

19 mars 2006, 01:50

Non, comme je le disais dans l'autre thread, pas de file_exists() avec le wrapper HTTP. En revanche je suis étonné que tu obtiennes les mêmes performances avec fsockopen(), est-ce que tu fermes/réouvres le socket à chaque itération ? Est-ce que tu utilises bien HEAD (et non GET) pour vérifier la présence du fichier ?

En utilisant 2 sockets non-bloquants avec keep-alive (pour peu que le mode soit supporté par le serveur en face) tu devrais obtenir au minimum le double de performance comparé à fopen().

ViPHP
fab
ViPHP | 2657 Messages

19 mars 2006, 02:09

socket_create est plus performant que fsockopen mais plus compliqué a manier aussi :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphant du PHP | 254 Messages

19 mars 2006, 02:35

arf :lol:
ben oui, dans mon script j'ouvrais et je fermais le socket a chaque test dans la boucle donc logique que les perfs soient .... identique. :!:

par contre je vais avoir un probleme pour utiliser les sockets et c'est pour ca que j'ai prefere zapper la chose, vu que le script final va tester la presence d'images sur les serveur de Colt et qu'il sont tres a cheval sur la sécu, je ne peux pas me faire remarquer a lancer quelques milliers de connexions ... de toute facon je crois etre limité a 12 connexions max par IP.

j'aurais tant aimé que file_exists() fonctionne avec une url :cry:
ca m'aurait bien facilité la chose ...

merci les gars