Probleme avec la fonction fopen

Signaler
Messages postés
8
Date d'inscription
dimanche 10 janvier 2010
Statut
Membre
Dernière intervention
13 janvier 2010
-
Messages postés
12
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
10 décembre 2010
-
Bonsoir,

J'ai toujours des problèmes avec la fonction fopen en php.

Pour info url_1 est une page qui existe et url_2 et une page qui n'existe pas.

Voici le script :

$url_1 = "http://www.phpcs.com/g/logos/normal/logophp.png";
$url_2 = "http://www.phpcs.com/g/logos/normal/azertyuiop.png";

if($handle = fopen("$url_1", "rb")){
echo"Ouverture du fichier => $url_1
";
}else{
echo"$url_1 introuvable
";
}

if($handle = fopen("$url_2", "rb")){
echo"Ouverture du fichier => $url_2
";
}else{
echo"$url_2 introuvable
";
}

Le serveur qui m'héberge ( mavenhosting.com ) me dit que les deux pages existes, ce qui est faut. Le même test effectué sur mon autre serveur ( strato.com ) fonctionne parfaitement, url_1 existe, url_2 n'existe pas.

J'ai essayé avec et sans l'option => ini_set ('user_agent', $_SERVER['HTTP_USER_AGENT']); en début de script.

J'ai modifier l'ini_set par toutes les options que j'ai trouvé sur les forums, documentation officiels, etc... et rien ne fonctionne.

Si quelqu'un à une idée elle est la bien venu.

20 réponses

Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,


[...]url_2 et une page qui n'existe pas.

Oui, mais non.
En fait elle existe, le site renvoie un code 302 (page trouvée) mais redirige sur /404.aspx?aspxerrorpath=/g/logos/normal/azertyuiop.png

pas très respectueux des standards tout ça.

Impossible à détecter donc via fopen, par contre moyennent un strpos voir une regex sur le contenu renvoyé :
<html><head><title>Object moved</title></head>

Object moved to [%2f404.aspx%3faspxerrorpath%3d%2fg%2flogos%2fnormal%2fazertyuiop.png here].


</html>

Ca devrait le faire.

Cordialement,

Kohntark -
Messages postés
8
Date d'inscription
dimanche 10 janvier 2010
Statut
Membre
Dernière intervention
13 janvier 2010

Merci pour ton aide.

La situation est pire.

Aucune informations sur la redirection.
Lorsque j'enlève le @, pas de message d'erreur.
Lorsque je demande à afficher le contenu de la page ( qui devrais être celle d'une erreur 404 ) il ni a rien, c'est vide.

Je viens de remarque à l'instant qu'une autre fonction php ne fonctionne pas.

if (checkdnsrr("http://www.google.fr","A")){echo "Google actif !";}else{echo "Google inactif !";}

C'est invraisemblable.
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Aucune informations sur la redirection.

Heu, sisi, il fait bien une redirection sur l'adresse indiquée plus haut.
Si tu cherches cela via fopen / fread bien évidemment tu ne risques pas de le voir

Lorsque j'enlève le @, pas de message d'erreur.

Quel @ ??
Pourquoi voudrais tu qu'il y ait une erreur ? Le site renvoie un code 302, pas 404.

Lorsque je demande à afficher le contenu de la page ( qui devrais être celle d'une erreur 404 ) il ni a rien, c'est vide.

Peut on voir ton code ? Parce qu'il n'y a pas de raison que ça ne fonctionne pas.


Je viens de remarque à l'instant qu'une autre fonction php ne fonctionne pas.

Qu'est ce qui ne fonctionne pas ? Quel résultat ?
Quelle version de PHP ? Quel OS ?
http://www.google.fr
=>
www.google.fr

Cordialement,

Kohntark -
Messages postés
8
Date d'inscription
dimanche 10 janvier 2010
Statut
Membre
Dernière intervention
13 janvier 2010

En faite l'adresse http n'est qu'un exemple. Je peu prendre n'importe quel URL de n'importe quel site que fopen me répond que l'URL existe.

Le signe @ avant fopen désactive l'erreur en cas d'échec. ( Si l'URL n'existe pas ).

Le code est celui que j'ai fourni plus haut. Une page index.php est le script c'est tout basique.

Cette ligne de code me répond que le site n'existe pas =>

if (checkdnsrr("http://www.google.fr","A")){echo "Google actif !";}else{echo "Google inactif !";}

J'ai tester avec différent sites, c'est toujours la même chose domaine inactif.
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Le même test effectué sur mon autre serveur ( strato.com ) fonctionne parfaitement, url_1 existe, url_2 n'existe pas.

J'ai dû mal à comprendre pourquoi il renverrait qu'url_2 (http://www.phpcs.com/g/logos/normal/azertyuiop.png) n'existe pas
Etait ce bien avec les mêmes exemples ?
A mon avis, Codes Sources ne renvoi jamais d'erreur 404.

Le signe @ avant fopen désactive l'erreur en cas d'échec[...]
Le code est celui que j'ai fourni plus haut. Une page index.php est le script c'est tout basique.

J'avais bien compris pour le @, mais vu qu'il n'est pas présent dans le script que tu donnais, ni même la partie "affichage" qui ne te retourne rien, je m'interrogeais sur la façon dont tu l'avais mis en oeuvre.

if (checkdnsrr("http://www.google.fr","A")){echo "Google actif !";}else{echo "Google inactif !";}

Je l'ai dit juste avant :
http://www.google.fr
=>
www.google.fr


Remplace donc http://www.google.fr par www.google.fr

... et accessoirement réponds à mes questions :
Quelle version de PHP ? Quel OS ?



Juste pour lever le doute, si tu fais ça :

<?php
$aUrl = array (
"http://www.fghfhzeazae.fr/",
"http://kohntark.fr/eesqdqsee.jpg",
"http://www.google.fr/images/firefox/firefox.png"
);

foreach ($aUrl as $k=>$url) {
    if (false !$handle fopen($url, "rb")) {

        echo 'Ouverture du fichier '.$url.' => OK
';
    } else {
        echo 'Ouverture du fichier '.$url.' => Introuvable
';
    }
}
?>


Quels sont les messages exacts affichés ??



Kohntark -
Messages postés
8
Date d'inscription
dimanche 10 janvier 2010
Statut
Membre
Dernière intervention
13 janvier 2010

Voici l'adresse du site avec le script original. Le code source apparait avec le résultat.

http://www.datao.be

Le signe @ que je le met ou pas ne change strictement rien.

http://www.google.fr ou www.google.fr m'affiche que google n'existe pas mais je peu remplacer l'URL par n'importe laquelle que le script me dit qu' il n'existe pas.

J'ai ajouter le phpinfo(); sur le site :

PHP Version 5.2.9
Linux serveur.maven2-4.com 2.6.31.5-grsec-xxxx-grs-ipv4-64 #3 SMP Tue Nov 24 16:51:16 UTC 2009 x86_64

Le resultat tel qu'il apparait sur mon site de ton script :

Warning: fopen() [function.fopen]: Couldn't resolve host name in /home/dataobe/public_html/index.php on line 61

Warning: fopen(http://www.fghfhzeazae.fr/) [function.fopen]: failed to open stream: operation failed in /home/dataobe/public_html/index.php on line 61
Ouverture du fichier http://www.fghfhzeazae.fr/ => Introuvable
Ouverture du fichier http://kohntark.fr/eesqdqsee.jpg => OK
Ouverture du fichier http://www.google.fr/images/firefox/firefox.png => OK
Messages postés
8
Date d'inscription
dimanche 10 janvier 2010
Statut
Membre
Dernière intervention
13 janvier 2010

la fonction checkdnsrr semble fonctionner se matin.
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
humm ... bizarre, il y a sans doute une explication simple, mais pour le coup je sèche un peu (mais on va trouver ).

Afin d'avoir plus d'éléments peux tu modifier ta page ainsi (si tu peux laisse uniquement ce code afin de faciliter les tests) :
(en laissant l'affichage des erreurs activé comme c'est déjà le cas)

<?php
$aUrl = array (
"http://kohntark.fr/eesqdqsee.jpg",
"http://kohntark.fr/cs_test.php"
);

foreach ($aUrl as $k=>$url) {
    if (false !$handle fopen($url, "rb")) {
        echo '<hr />Ouverture du fichier '.$url.' => OK
';
        var_dump($http_response_header);
        echo '<hr />';
    } else {
        echo 'Ouverture du fichier '.$url.' => Introuvable
';
        var_dump($http_response_header);
        echo '<hr />';
    }
}
?>


Ca va permettre de voir avec une précision suffisante les échanges et les résultats de ces derniers (en modifiant de mon côté les réponses envoyées)

Sans y réfléchir plus que ça fopen devrait retourner false si le code renvoyé est 404, et c'est ce que je te renvoie lorsque tu appelles "http://kohntark.fr/eesqdqsee.jpg"
J'ai rapidement fait le test sur 3 config différentes et le résultat est le même.

Je confirme, maintenant que j'ai réellement fait le test avec le code, que ""http://www.phpcs.com/g/logos/normal/azertyuiop.png";" redirige via un 302 et que très logiquement fopen renvoie true.

Cordialement,


Kohntark -
Messages postés
8
Date d'inscription
dimanche 10 janvier 2010
Statut
Membre
Dernière intervention
13 janvier 2010

Bonsoir,

j'ai mis le code en place. Je te laisse juger du résultat.

Merci encore du coup de mains.
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
mouais, là pour le coup je suis assez étonné. Je n'ai pas fait 5000 tests mais ça me parait franchement bizarre :
- le var_dump semble répondre NULL
... alors que le script répond 'OK', ce qui devrait, si je ne m'abuse, correspondre à quelque chose, ce quelque chose étant les headers renvoyés. J'ai testé avec un 404, un 200, un 302, un 401 ... toujours le même résultat (OK et NULL pour le var_dump)

- j'ai fais en parallèle des tests à partir de 2 configs bien différentes, qui donnent toutes deux les mêmes résultats (attendus)

Je le répète, je n'ai pas fait trop de tests, mais en l'état actuel des choses je pense que tu devrais t'adresser directement à ton hébergeur, car je soupçonne une config un peu spéciale, ... voire merdique

Laisse ta page en l'état si tu peux, j'essaierai de faire de plus amples tests demain, et de regarder un peu le php.ini.

Tiens moi au courant si tu as une réponse de ton hébergeur et n'hésites pas, s'il te prends un peu pour un con (c'est souvent le cas, mais je ne veux pas pré juger) de lui fournir le peu de tests qui ont été effectués ici (notamment que fopen retourne toujours true, même dans le cas d'une réception de codes 404, 401, ...)

peut être que demain je me dirai "putain, mais bien sur !!!" ou qu'un autre intervenant passera par là et nous exposera le pourquoi du comment. C'est à souhaiter

Je re teste lorsque j'aurai un peu plus ma tête.

Bonne soirée,

Kohntark -
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Tant que tu y es, modifies ainsi :

<?php
$aUrl = array (
"http://kohntark.fr/eesqdqsee.jpg",
"http://kohntark.fr/cs_test.php"
);

foreach ($aUrl as $k=>$url) {
    if (false !$handle fopen($url, "rb")) {
        echo '<hr />Ouverture du fichier '.$url.' => OK
';
        var_dump($http_response_header);

    } else {
        echo 'Ouverture du fichier '.$url.' => Introuvable
';
        var_dump($http_response_header);
    }
    
    if (false !$fgc file_get_contents($url)) {
        echo '
file_get_contents : 
'.$fgc.'
<hr />';
    } else echo '
echec file_get_contents
';
}
?>

C'est fait à l'arrache, juste pour lever 1 autre doute.

Il y a plein d'autres tests qui pourraient être fait, notamment avec cUrl, histoire de connaitre précisément les headers reçus.

Tu es en mutualisé ? en serveur dédié ?


Kohntark -
Messages postés
8
Date d'inscription
dimanche 10 janvier 2010
Statut
Membre
Dernière intervention
13 janvier 2010

Bonsoir,

J'ai placer le script en ligne.

Je suis en contact avec l'hébergeur depuis maintenant une semaine. Date à laquelle j'ai souscrit à leur offre. Ils sont parfaitement au courant de la situation, des tests effectués et même du fait que j'ai l'aide d'une autre personne.

Au début c'était : << vérifier votre code vous avez une erreur. >>
Après un autre technicien me propose de changer de serveur puis un deuxième interviens et me dit encore que j'ai une erreur dans mon script.

Aujourd'hui le deuxième technicien après un nombre in-calculé de rappel comme quoi il ni a pas d'erreurs dans mon script me propose également de changer de serveur ce que j'ai accepté.

Je te tiendrais au courant dans la journée de demain pour te dire si leur serveur est bien la cause de tout mes traquas.

Je n'ai pas de serveur dédié.

Je te souhaite de passer une bonne soirée.
Messages postés
8
Date d'inscription
dimanche 10 janvier 2010
Statut
Membre
Dernière intervention
13 janvier 2010

Le problème est résolu. C'était bien le serveur qui avait un problème de configuration. Merci pour tout kohntark.
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Ouf, ça me paraissait bizarre cette affaire et la source du problème me rassure je dois dire.
Tant mieux si c'est résolu.

Bonne continuation Meltraxxx,



Kohntark -
Messages postés
12
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
10 décembre 2010

Bonjour, je profite de ce sujet pour exposer mon problème avec la fonction fopen.

J'ai un code qui l'utilise, ce code fonctionne parfaitement en local et sur un serveur php5, et quand je l'ai mit sur un serveur php4, il a fonctionné une fois, puis depuis plus du tout.

J'ai nettoyer le code afin de trouver d'ou venait l'erreur, du coup maintenant il ne reste plus que:

$fp=fopen("rapport", "w+");
var_dump($fp);

J'ai mi le var dump pour savoir quand est ce qu'elle fonctionnait.
Pour l'instant ca affiche toujours "bool(false)";

Si quelqu'un a une idée de ce qui empêche le fopen de fonctionner sur mon serveur php4, cette personne est la bienvenue!
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

Merci de créer un nouveau message plutôt que venir interférer avec un autre post résolu qui n'a sans doute rien à voir avec ton problème.

Quel est cet hébergeur qui impose encore du PHP4 ?
Tu devrais sans doute changer

Quel est le message d'erreur lorsque l'affichage de celles ci est activé ?


Cordialement,


Kohntark -
Messages postés
12
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
10 décembre 2010

mmm je soupçonne beaucoup le serveur d'y etre pour quelque chose quand meme.

Pas de message d'erreur, j'ai beau l'activer ca n'affiche pas les messages d'erreur (enfin, pas tous).

Je bosse dans une boite qui a les même serveurs depuis 10 ans et qui a dessus des sites utilisant des module php objet. Et comme l'objet en php4 et très différent de l'objet en php5 , ils ne veulent pas trop changer de serveur (dommage). Du coup je tombe souvent sur des problèmes avec ses serveurs.

Donc pas d'affichage d'erreur, j'ai juste fait le test
$fp=fopen("rapport","w+");
var_dump($fp);


En local et sur un serveur php5, cela me renvoie la ressource utilisée, sur le serveur php4, ca me renvoie "bool(false)"

Je pense que je vais demander aux techniciens de faire ce test sur le serveur.
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
(enfin, pas tous)

C'est à dire ?

Comment actives tu cet affichage des erreurs ?

As tu le même résultat en procédant ainsi ? :

ini_set('display_errors', 1);
error_reporting(-1);
$fp=fopen("rapport","w+");
var_dump($fp);


Quelle version de PHP utilises tu ? Quel OS ?
Même résultat si tu passes le chemin complet ?
Et en ne faisant que lire ('r') ?
Tu n'as pas un open_basedir des fois ?


Kohntark -
Messages postés
12
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
10 décembre 2010

J'ai fait ton code (c'est du init set que je parlais quand je parlais de l'affichage d'erreur)

il me renvoie cela:
Warning: fopen(rapport): failed to open stream: Permission denied in /home/httpd/vhosts/francepanel.fr/httpdocs/administration/load_rapport.php on line 11
bool(false) 


J'ai déjà mis le fichier php (pas le fichier rapport) en mod 777 par le biais du ftp, ca ne change rien.
Il faut savoir que je veux "crée" un fichier, donc le fichier "rapport" n'existe pas. Normalement, je dois génère un fichier a chaque fois que j'exécute mon programme, donc des que le fopen marchera, je devrais mettre une variable dans le nom de fichier.

LE serveur est sous linux, avec PHP 4 (sous le 5 ca marche nickel).

En lecture, si je met un fichier "rapport" en ligne, ca marche nickel. Mais c'est pas vraiment ce que je recherche...
Messages postés
12
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
10 décembre 2010

J'ai finit par trouver mon problème, je te remercie de ton aide.

Apparemment l'un des dossiers parents n'était pas en mode écriture, ce qui du coup faisait tout foiré(vraiment bête de pas avoir vérifier avant).

Je te remercie de ton aide en tout cas!!

a la revoyure ^^.