Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/07/2007, 18h51   #1
Invité de passage
 
Inscription : mars 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 18
Points : 4
Points : 4
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!
ludoi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2007, 19h38   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 827
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 827
Points : 3 459
Points : 3 459
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 ).

Citation:
- 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.

Citation:
- 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.

Citation:
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...

Citation:
- 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.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2007, 21h18   #3
Invité de passage
 
Inscription : mars 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 18
Points : 4
Points : 4
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 :
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
ludoi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 08h45   #4
Expert Confirmé
 
Avatar de trotters213
 
Inscription : janvier 2005
Messages : 2 572
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Gard (Languedoc Roussillon)

Informations forums :
Inscription : janvier 2005
Messages : 2 572
Points : 2 605
Points : 2 605

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 :
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);
?>
__________________
Pensez au tag
Les règles du Forum

Dev. Web : FAQ (X)HTML/CSS | Tutos (X)HTML | Tutos CSS

PHP : FAQ PHP | Tutos PHP | Benchmark PHP 5

SQL : Cours SQL
trotters213 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h19.


 
 
 
 
Partenaires

Hébergement Web