Charger un XML créé dynamiquement dans une page php

Petit nouveau ! | 4 Messages

05 juil. 2007, 11:09

Bonjour à tous...

je me tourne vers vous car depuis 2 jours, je n'arrive pas à débloquer ma situation avec un script PHP.
J'ai développé un script PHP qui permet de charger des datas d'une BDD et de les sortir en echo sous forme XML...

Code : Tout sélectionner

<?php header("Content-Type: text/xml; charset=utf-8"); header("Pragma: no-cache"); header("Expires: 0"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache"); $xml = '<?xml version="1.0" encoding="UTF-8"?>'; $xml .= '<annonces>'; $xml .= '<annonce>blabla</annonce>'; $xml .= '<annonce>blibli</annonce>'; $xml .= '<annonce>bloblo</annonce>'; $xml .= '</annonces>'; echo $xml; ?>
dans le double but :
- pour un système AJAX (coté internaute) pour avoir une recherche rapide...
- pour alimenter un tableau (coté admin) avec ce code :

Code : Tout sélectionner

<?php error_reporting(E_ALL); ini_set('display_errors', 1); $file = $_SERVER['HTTP_REFERER']."php/getAnnonces.php"; $xml = simplexml_load_file(rawurlencode($file)); if ($xml) { $nbAnnonces = count($xml->children()); echo("<br />nbAnnonces = ".$nbAnnonces); if ($nbAnnonces > 0) { for($i = 0; $i < $nbAnnonces; $i++) { // remplissage du tableau } } } ?>
Rien d'extraordinaire me dirais vous jusqu'à là... :)

Tout ça marche très bien en local sous WAMP (PC-dev) et même depuis un autre poste vers PC-dev.
Le problème est que ce même script pour charger l'XML afin de remplir le tableau admin ne marche pas sur le serveur de production (Apache 2.2.4 + PHP 5.2.3)

J'obtiens ce message d'erreur :
Warning: simplexml_load_file(http://encours.XXXXXXXX.fr/php/getAn....php) [function.simplexml-load-file]: failed to open stream: Une tentative de connexion a échoué car le parti connecté n'a pas répondu convenablement au-delà d'une certaine durée ou une connexion établie a échoué car l'hôte de connexion n'a pas répondu. in W:\encours\XXXXXXXX\admin\tableau_annonces.php on line 114

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http%3A%2F%2Fencours.XXXXXXXX.fr%2Fphp%2FgetAnnonces.php" in W:\encours\XXXXXXXX\admin\tableau_annonces.php on line 114

Fatal error: Maximum execution time of 30 seconds exceeded in W:\encours\XXXXXXXX\admin\tableau_annonces.php on line 114
J'ai essayé de diverses manières, notamment en remplaçant simplexml_load_file() par :

Code : Tout sélectionner

$xml = new DOMDocument; $xml->load($file);
mais le message est le même hormis le nom des fonctions.

Je pense que le problème vient de la config du serveur de prod mais où ?

HELP !!! :(

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

05 juil. 2007, 11:27

Je te donne en vrac quelques problèmes que j'ai pu relever (pas forcément lié au problème que tu décris)
  • $_SERVER['HTTP_REFERER'] est une donnée utilisateur. Elle n'est pas toujours renseignée (donc ne marchera pas toujours) et surtout l'utilisateur peut y mettre ce qu'il veut. Si je visite ta page an utilisant "http://www.example.com" comme HTTP_REFERER je vais te forcer à télécharger une page externe. Avec un peu de malice je pourrais imaginer utiliser ton serveur pour lancer des attaques sur d'autres serveurs tout en restant anonyme. Pire encore, je pourrais t'envoyer "ssh://root:[email protected]:22" comme HTTP_REFERER et voir si je peux utiliser ta machine pour forcer l'accès SSH d'une autre. Oublie l'accès via HTTP, et utilise une fonction qui crée le fichier XML, ensuite tu peux appeler cette fonction soit pour l'envoyer directement (Ajax) soit pour la traiter avec SimpleXML (ton truc d'admin)
  • en y réfléchissant, si tu fais ça tu n'auras plus le problème du timeout et compagnie... donc en fait ça résoud ton problème
  • utilise ça plutôt qu'un for:
    foreach ($xml->children() as $child)
    {
       //...
    }
    ...ou plus simplement encore
    foreach ($xml->annonce as $annonce)
    {
       //...
    }

Petit nouveau ! | 4 Messages

05 juil. 2007, 11:47

Merci Hubert Roksor pour tes conseils... :wink:

¤ ok pour le referer, ceci est mieux donc :
$file = "http://".$_SERVER['HTTP_HOST']."/php/getAnnonces.php";
¤ ok pour le foreach :wink:

¤ mais pour :
Oublie l'accès via HTTP, et utilise une fonction qui crée le fichier XML, ensuite tu peux appeler cette fonction soit pour l'envoyer directement (Ajax) soit pour la traiter avec SimpleXML (ton truc d'admin)
je ne vois pas bien comment utiliser une fonction dans mon cas.
AJAX peut appeller une fonction PHP ? et pas seulement exécuter un script retournant traditionnelement un XML ?
Moi je pensais qu'il fallait absolument que mon getAnnonces.php retourne un XML ! Je me trompes donc ?

:roll:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

05 juil. 2007, 12:45

Par exemple:

generer_annonces.php
<?php
function generer_annonces()
{
	$xml = '<?xml version="1.0" encoding="UTF-8"?>'; 
	$xml .= '<annonces>'; 
	$xml .= '<annonce>blabla</annonce>'; 
	$xml .= '<annonce>blibli</annonce>'; 
	$xml .= '<annonce>bloblo</annonce>'; 
	$xml .= '</annonces>';
	return $xml;
}
getAnnonces.php
<?php
header("Content-Type: text/xml; charset=utf-8"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-cache"); 

include 'generer_annonces.php';
echo generer_annonces();
admin.php
<?php
include 'generer_annonces.php';
$xml = simplexml_load_file(generer_annonces());
if ($xml) {
	// ...
}
Au fait, j'avais oublié dans mon premier post, je ne sais pas pourquoi tu utilises rawurlencode(), c'est une fonction qui n'est utile que lorsqu'on génère une URL. Elle devrait être inutile ici (et probablement faire planter le script).

Petit nouveau ! | 4 Messages

06 juil. 2007, 14:26

:D pas bête ! J'essaye ça tout de suite... :P

rawurlencode() est utilisé pour encoder $file car cette une URL... nan ? :roll:

[EDIT]
bon alors, cette méthode marche très bien... :)

Cependant, j'aimerais bien comprendre pourquoi ma première méthode ne fonctionne pas.
Surtout qu'avec un *.xml, cela marche !

... je vais essayer de modifier l'entête... :?
[/EDIT]

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

11 juil. 2007, 18:34

rawurlencode() est utilisé pour encoder $file car cette une URL... nan ?
À l'origine je l'avais lu dans l'autre sens et pensais que tu faisais urlencode() sur ce que renvoyait simplexml_load_file(). À part ça, euh, non, urlencode() sert à échapper les caractères spéciaux pour les utiliser dans le nom d'un dossier/fichier ou dans la valeur d'une variable. Si tu l'utilises sur l'URL complète, tu changes toute sa signification et la rend inutilisable (fais un echo de la variable pour le vérifier).
Cependant, j'aimerais bien comprendre pourquoi ma première méthode ne fonctionne pas.
Probablement à cause de l'URL qui ne fonctionne pas.

Petit nouveau ! | 4 Messages

25 juil. 2007, 10:08

Cependant, j'aimerais bien comprendre pourquoi ma première méthode ne fonctionne pas.
Probablement à cause de l'URL qui ne fonctionne pas.
J'ai enlevé rawurlencode() et cela ne fonctionne toujours pas... :?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

25 juil. 2007, 11:36

Poste le script (ou le passage en question) ainsi que le message d'erreur que tu reçois.