IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

fonction file_exists avec une URL [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 466
    Points : 333
    Points
    333
    Par défaut fonction file_exists avec une URL
    Bonjour
    J'utilise Wampserver 3.1.9 64 bits en local avec PHP 7.2.18.
    Je veux savoir si un fichier texte sur une adresse externe est lisible à partir d'un script php.
    Concrètement si je tape : url/monfichier.txt, son contenu s'affiche dans le navigateur
    Si j'utilise file_exists("url/monfichier.txt") il retourne false.
    J'ai vérifié que allow_url_fopen = On
    Le fichier texte fait moins de 1ko
    Si quelqu'un peut m'expliquer pourquoi ça ne marche pas.
    Ce que j'ai lu sur le web ne m'a pas beaucoup avancé (en particulier toutes les réponses que j'ai lues partaient du principe que le demandeur n'avait pas vérifié que allow_url_fopen était bien sur ON dans le PHP.ini).

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 466
    Points : 333
    Points
    333
    Par défaut Incohérence ?
    Je me réponds à moi-même car je suis allé un peu plus loin dans ma recherche :
    Si je ne mets pas le test file_exists("url/monfichier.txt") et que je tape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    			$fp=fopen("url/monfichier.txt");
    			$n=fgets($fp,255);
    			fclose($fp);
                            echo $n
    ça marche : le contenu de mon fichier s'affiche correctement !

    N'est-il pas incohérent qu'un fichier qui renvoie faux à la fonction d'existence soit lisible quand même.

  3. #3
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour
    file_exists ne fonctionne pas avec une url type "http://".
    On peut vérifier dans la documentation que ce protocole url ne fait pas partie de ceux supportés.

    L'utilisation de fopen avec une url "http://" n'est pas comparable.
    Dans ce cas, fopen n'ouvre pas directement le fichier du serveur.
    Il y aurait justement un résultat très différent entre faire fopen('fichier.php','r') et fopen('http://127.0.0.1/fichier.php','r').
    D'ailleurs, dans le second cas, le fichier pourrait ne pas exister physiquement sur le serveur tout en obtenant pourtant un contenu grâce à une réécriture d'url.
    De ce point de vue, il peut paraître logique que file_exists ne fonctionne pas avec ce protocole.

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 466
    Points : 333
    Points
    333
    Par défaut
    Pourtant on peut lire ceci ici (https://www.php.net/manual/fr/function.file-exists.php) :
    À partir de PHP 5.0.0, cette fonction peut aussi être utilisée avec quelques protocoles url. Lisez Liste des protocoles et des gestionnaires supportés pour connaître les protocoles supportant la famille de fonctionnalités de stat().
    Et la liste des protocoles acceptés :
    PHP dispose de nombreux gestionnaires pour différents types de protocoles de style URL, à utiliser avec les fonctions de manipulation de fichiers telles que fopen(), copy(), file_exists() et filesize(). En plus de ces gestionnaires, vous pouvez écrire vos gestionnaires personnalisés et les enregistrer avec la fonction stream_wrapper_register().

    Note: La syntaxe d'URL utilisée pour décrire un gestionnaire est exclusivement de la forme scheme://.... Les syntaxes de la forme scheme:/ et scheme: ne sont pas supportées.

    Sommaire ¶

    file:// — Accès au système de fichiers local
    http:// — Accès aux URLs HTTP(s)
    ftp:// — Accès aux URLs FTP(s)
    php:// — Accès aux divers flux I/O
    zlib:// — Flux de compression
    data:// — Données (RFC 2397)
    glob:// — Trouve des noms de fichiers correspondant à un masque donné
    phar:// — Archive PHP
    ssh2:// — Shell sécurisé 2
    rar:// — RAR
    ogg:// — Flux Audio
    expect:// — Flux d'interactions de processus
    Je précise bien que le fichier que j'ouvre est sur le net (sur un site hébergé chez OVH pour être précis), pas en local. J'ai vérifié que le résultat renvoyé est bien celui qui se trouve sur le fichier distant. Même après avoir vidé le cache du navigateur.

  5. #5
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonsoir,
    Citation Envoyé par Patrice Henrio Voir le message
    Pourtant on peut lire ceci ici (https://www.php.net/manual/fr/function.file-exists.php) :

    Et la liste des protocoles acceptés :
    Il ne sont pas tous "acceptés" pour file_exists.
    Il faut tenir compte de ceci : "les protocoles supportant la famille de fonctionnalités de stat()."
    Or, à la page sur "http://", stat() est indiqué comme non supporté.

    Citation Envoyé par Patrice Henrio Voir le message
    Je précise bien que le fichier que j'ouvre est sur le net (sur un site hébergé chez OVH pour être précis), pas en local.
    Oui, mais la logique de ce que j'ai expliqué reste la même à mon sens.

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 466
    Points : 333
    Points
    333
    Par défaut
    OK
    De toutes façons l'expérience montrait que tu avais raison, ça marche pour fopen et pas pour file_exists.

    Par contre je ne comprends pas cette phrase
    Dans ce cas, fopen n'ouvre pas directement le fichier du serveur.
    Comment le client peut connaître le contenu du fichier distant sans l'ouvrir ?

  7. #7
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour,
    On ouvre la réponse du serveur en fait.
    On peut imaginer ce test en local :

    fichier "test.php"
    fichier "ouvrir.php"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    var_dump(
    	fgets(fopen('http://127.0.0.1/test.php','r')), //affichera "test"
    	fgets(fopen('test.php','r'))); //affichera "<?= 'test'?>"
    Quand on passe par l'url, on peut donc obtenir un contenu qui diffère du contenu réel du fichier.

    On peut même avoir un contenu sans qu'il y ait réellement de fichier sur le serveur.
    Exemple, on définit, dans un htaccess, cette règle d'écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RewriteEngine on
    RewriteRule test.txt pasDeFichierTest.txt
    Dans le fichier "pasDeFichierTest.txt" on écrit : "Il n'y a pas de fichier test.txt".
    fopen('http://127.0.0.1/test.txt','r') va fonctionner sans problème et on pourra récupérer la chaîne "Il n'y a pas de fichier test.txt".
    Dans ce cas de figure, qu'aurait été censé retourner file_exists s'il avait été supporté ?
    Ce qu'on peut savoir plutôt c'est si l'url est valide ou pas (on peut utiliser get_headers), mais on ne saura pas si le fichier existe vraiment sur le serveur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Debutant] envoi d'un message POST avec une URL
    Par Yannos94 dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 14/06/2006, 10h22
  2. [debutant]fonction "split" avec une chaine comme m
    Par EpOnYmE187 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/11/2005, 22h46
  3. [HTTP][Socket] avec une url c'est possible ?
    Par tck-lt dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 19/08/2005, 09h39
  4. [C#] Comment récuper un page xml avec une URL
    Par pc152 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/02/2005, 16h17
  5. fonctions stockées avec une table en argument
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/10/2004, 23h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo