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 :

Ouvrir un fichier local comme s'il s'agissait d'un fichier distant


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Par défaut Ouvrir un fichier local comme s'il s'agissait d'un fichier distant
    Bonjour à tous!

    Je cherche à ouvrir des fichiers php situés sur mon serveur local comme s'il s'agissait de fichiers distants. En d'autres termes, je cherche à émuler une requète http sur des fichiers locaux (recevoir headers, choisir méthode de connection, déclencher parseur...).

    Pour l'instant, la méthode que j'utilise consiste à appeler le fichier par son adresse absolue:
    fopen ('http://www.monsite.com/test.php?var=1') )
    Bien sur, ça fonctionne mais je me pose des questions quant aux performances. Que se passe t-il dans ce cas là?

    - la requête part sur le réseau, les dns doivent être re-résolus, une nouvelle connection simultanée déclenche un nouveau processus gourmand en mémoire... (j'imagine, je sais pas)?
    ou
    - apache/php réagi en prenant immédiatement en compte le fait que la requète part du même serveur et optimise le processus?

    Sinon, si ce n'est pas ce dernier cas:
    - Y a t-il un autre moyen plus optimal que d'utiliser l'url absolue?
    - Ai-je raison de m'inquiéter sur les performances avec cette méthode?


    Merci d'avance!

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 334
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 334
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par ludoi
    Pour l'instant, la méthode que j'utilise consiste à appeler le fichier par son adresse absolue:
    fopen ('http://www.monsite.com/test.php?var=1') )
    Bien sur, ça fonctionne mais je me pose des questions quant aux performances. Que se passe t-il dans ce cas là?
    Exactement la même chose que si qqu'un ouvrait la page en question avec son navigateur (une fois que tu auras tout lu bien sûr ).

    - la requête part sur le réseau, les dns doivent être re-résolus, une nouvelle connection simultanée déclenche un nouveau processus gourmand en mémoire... (j'imagine, je sais pas)?
    Je pense.

    - apache/php réagi en prenant immédiatement en compte le fait que la requète part du même serveur et optimise le processus?
    M'étonnerait.

    Sinon, si ce n'est pas ce dernier cas:
    - Y a t-il un autre moyen plus optimal que d'utiliser l'url absolue?
    Ça dépend de ce que tu veux au final, et comme tu n'as rien dit à ce propos...

    - Ai-je raison de m'inquiéter sur les performances avec cette méthode?
    Forcément, passer par HTTP pour ouvrir, au final, un fichier local sera moins performant que de taper directement sur le DD.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 18
    Par défaut
    Tu as parfaitement raison...

    Du coup, j'ai fais une fonction qui fait à peu près ce que je veux, j'espère juste qu'elle n'est pas plus lourde en calcul que le serait une requête externe http !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    function EmulateHttpRequestOnLocalFile ( $localfilepath , $queries = false , $method = 'GET' )
    	{
    	$method = strtoupper ( $method );
    	if ( !$localfilepath )
    		{
    		// Pas de fichier reçu
    		return false;
    		}
    	else
    		{
    		// Separation si variables get
    		list ( $localfilepath , $querystring ) = explode ( '?' , $localfilepath );
    		// start buffering
    		ob_start ();
    		// repertoire courant
    		$currentDir = getcwd();
    		// Modification du répertoire courant de travail >> '../xmlserver'
    		chdir ( dirname ( $localfilepath ) );
     
    			if ( is_readable ( basename ( $localfilepath ) ) )
    			{
    			//////// Envoi des variables
    			// Mise en cache des variables post, request et get
    			// elles vont être indisponibles le temps que la requète soit envoyée
    			$__POST = $_POST;
    			$__GET = $_GET;
    			$__REQUEST = $_REQUEST;
    			unset ( $_POST , $_GET , $_REQUEST );
     
    			// Si variables dans l'url, il faut les envoyer telles que precisées par $method
    			if ( $querystring )
    				{
    				$params = explode ( '&' , $querystring );
    				if ( is_array ( $params ) && count ( $params ) > 0 )
    					{
    					foreach ( $params as $param )
    						{
    						list ( $key , $value ) = explode ( '=' , $param );
    						if ( $method == 'GET' ) $_GET[$key] = $value;
    						else $_POST[$key] = $value;
    						$_REQUEST[$key] = $value;
    						}
    					}
    				}
    			// Si variables dans $queries, il faut les envoyer telles que precisé par $method
    			if ( is_array ( $queries ) && count ( $queries ) > 0 )
    				{
    				foreach ( $queries as $key=>$value )
    					{
    					if ( $method == 'GET' ) $_GET[$key] = $value;
    					else $_POST[$key] = $value;
    					$_REQUEST[$key] = $value;
    					}
    				}
    			// include du fichier xml (seulement le nom de fichier)
    			include ( basename ( $localfilepath ) );
    			}
    		else
    			{
    			// Reinitialisation du répertoire courant de travail
    			chdir ( $currentDir );
    			// Effacer tampon de sortie
    			ob_end_clean ();
    			// return false
    			return false;
    			}
    		// Reinitialisation du répertoire courant de travail
    		chdir ( $currentDir );
    		// Reinitialisation des variables _get, _post...
    		$_POST = $__POST;
    		$_GET = $__GET;
    		$_REQUEST = $__REQUEST;
    		unset ( $__POST , $__GET , $__REQUEST );
    		// Retour du contenu interprété
    		$return = ob_get_contents ();
    		ob_end_clean();
    		return $return;
    		}
    	}

    Bien sur, ça peut encore être amélioré (lire les headers en recherchant dans le contenu un la chaine "header(.." ...


    Exemple d'utilisation:

    - une page génère php un flux xml sur ton serveur. http://monsite.com/xml.php?act=lastnews

    Pour en afficher le contenu, il est obligatoire de l'interroger en http. Essayer de l'ouvrir en local renverra le code php et le passage de la variable act peut être une source de bug.

    Là, il est possible de recupérer le contenu parsé avec une url du genre:
    EmulateHttpRequestOnLocalFile ( '../xml.php?act=lastnews' , $queries = false , $method = 'GET' )

    En espérant que ça puisse être utile à quelqu'un d'autre que moi

  4. #4
    Membre Expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Par défaut

    Citation Envoyé par ludoi
    Du coup, j'ai fais une fonction qui fait à peu près ce que je veux, j'espère juste qu'elle n'est pas plus lourde en calcul que le serait une requête externe http !
    Fais toi un benchmark sur les fonctionnalités :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $debut = microtime(true);
    /*
    ...
    une super boucle sur le code que tu veux tester
    ... 
    */
    $fin = microtime(true);
    echo 'Durée du script : '.round($fin - $debut, 4);
    ?>

Discussions similaires

  1. Impossible d'ouvrir un fichier local avec Firefox
    Par StripMat dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 17/02/2015, 12h08
  2. navigateToURL ouvrir Safari pour un fichier local
    Par VulpesZerda dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 24/10/2014, 16h06
  3. Ouvrir un fichier local par un lien
    Par lucmans dans le forum Langage
    Réponses: 8
    Dernier message: 15/06/2012, 11h49
  4. Ouvrir un fichier local , via une application Web
    Par Panneau dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 22/05/2008, 15h20
  5. [FB] SGBD mono-fichier aussi ? (comme IB)
    Par qi130 dans le forum Débuter
    Réponses: 1
    Dernier message: 10/09/2004, 10h37

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