Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
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 25/01/2012, 16h19   #1
Membre habitué
 
Homme
Enseignant
Inscription : avril 2002
Messages : 300
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France, Vosges (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : avril 2002
Messages : 300
Points : 100
Points : 100
Par défaut Fonctions récursives et out of memory

Bonjour,

Le code suivant permet d'appliquer des fonctions php aux variables de sessions à l'apparition de chaque nouvelle page.
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
 function array_map_recursive($func, $arr)
 {
 	
 	if(is_array($arr))
 	{
 		$result=array();
 		do{
 			$key=key($arr);
 			if(is_array(current($arr)))
 			{
 				$result[$key]=array_map_recursive($func,$arr[$key]);
 			}
 			else
 			{
 				$result[$key]=$func(current($arr));
 			}
 		}while(next($arr)!==false);
 		return $result;
 	}
 	else
 	{
 		return $func($arr);
 	}
 }
 
 
$fonctions_entrantes=array("addslashes", "htmlentities");
$fonctions_sortantes=array("stripslashes");

//Traitement des $_SESSION
if(isset($_SESSION))
{
  	foreach($fonctions_entrantes as $fct_in)
 	{
 		$_SESSION=array_map_recursive($fct_in,$_SESSION);
 	}
}
Au début, tout fonctionne correctement mais à partir d'un certain nombre de page ouverte. L'erreur Out of Memory sur la ligne en rouge apparait.

Je ne comprends pas pourquoi !!
Quelqu'un a-t-il une explication ?
Merci
bastien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 17h39   #2
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
peut-être parce qu'une fonction récursive est très gourmande en ressource mémoire...
Citation:
Le code suivant permet d'appliquer des fonctions php aux variables de sessions à l'apparition de chaque nouvelle page
si c'est des variables de sessions tu n'as pas besoin de leur refaire ce traitement à chaque 'apparition' d'une page...et si dans cette nouvelle page y a création de nouvelle variable de session : c'est à ce niveau que tu fais ton traitement (et qu'une fois).
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 08h41   #3
Membre habitué
 
Homme
Enseignant
Inscription : avril 2002
Messages : 300
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France, Vosges (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : avril 2002
Messages : 300
Points : 100
Points : 100
Bonjour,

Citation:
peut-être parce qu'une fonction récursive est très gourmande en ressource mémoire...
J'imagine parfaitement que la fonction est consommatrice de mémoire mais de là, à saturer l'ensemble des capacités de l'ordi, je suis fort surpris d'autant plus que je dois avoir qu'une vingtaine au mieux de variables de sessions.

Citation:
si c'est des variables de sessions tu n'as pas besoin de leur refaire ce traitement à chaque 'apparition' d'une page...et si dans cette nouvelle page y a création de nouvelle variable de session : c'est à ce niveau que tu fais ton traitement (et qu'une fois).
Je suis tout à fait d'accord. Cependant, mes variables de sessions sont créées et complétées au moment de la construction des pages. Et en fonction des pages, les sessions varient donc je vois difficilement la possibilité de controler un unique traitement. Je désirai faire un traitement de masse !!!!

Ou alors une autre solution serait de vérifier que la routine sur addslashes ne s'exécute que si \ n'est pas présent, via un controle par expression régulière .

C'est une réflexion.

Je suis toujours preneur d'avis !
merci
bastien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 20h33   #4
Membre éclairé
 
Inscription : juin 2007
Messages : 337
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 337
Points : 393
Points : 393
J'ai testé ta fonction, et je ne sais comment me suis retrouvé 2 fois avec des &amp et lt ,qui se reproduisent à l'infini et je n'arrive pas à reproduire cette faille..


Cela vient peu être d'un conflit entre les deux fonctions dans la boucle, pas le temps pour une d'avoir achevé son boulot, mais cela me paraît étrange.


regarde du coté de http://php.net/manual/fr/function.ar...-recursive.php pour ma part je trouve celle-ci très utile
__________________
Conception / Dev
ascito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 22h14   #5
Membre habitué
 
Homme
Enseignant
Inscription : avril 2002
Messages : 300
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France, Vosges (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : avril 2002
Messages : 300
Points : 100
Points : 100
Bonjour,

je veux bien tenter array_walk_recursive mais je ne suis pas sur de bien comprendre son fonctionnement dans mon cas.
je vais creuser
merci
bastien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 22h20   #6
Membre éclairé
 
Inscription : juin 2007
Messages : 337
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 337
Points : 393
Points : 393
donne nous un tableau exemple d'une session en entrée et en sortie à ce moment là, moi j'ai compris que tu ne t'occupais que du dernier segment du tableau...
__________________
Conception / Dev
ascito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 22h29   #7
Membre habitué
 
Homme
Enseignant
Inscription : avril 2002
Messages : 300
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France, Vosges (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : avril 2002
Messages : 300
Points : 100
Points : 100
non, non je m'occupe de tous les segments !

je te mets un exemple.
bastien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 22h59   #8
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
Code :
1
2
3
function clean($variable){
return addslashes(htmlentities($variable));
}
le voila ton traitement de masse, à chaque fois que tu crées une variable de session tu lui appliques cette fonction,...
Citation:
Je suis tout à fait d'accord. Cependant, mes variables de sessions sont créées et complétées au moment de la construction des pages. Et en fonction des pages, les sessions varient donc je vois difficilement la possibilité de controler un unique traitement. Je désirai faire un traitement de masse !!!!
Je ne vois vraiment pas : on à l'impression que tes pages donnent naissance à d'autres pages après que tu les ai codé et sans que tu puisse le contrôler...tu fais une IA ?
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 23h07   #9
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 554
Points : 2 554
Envoyer un message via Skype™ à rawsrc
Bonsoir,

Je ferais la même remarque que vorace, je ne comprend pas tout. M'enfin comme dirait un personnage célèbre.
Dans tous les cas voici comment faire pour ne pas avoir à s'occuper de la récursivité, PHP 5.3+ bien évidemment :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
 
$addslashes   = function(&$v, $k) { $v = addslashes($v); };
$htmlentities = function(&$v, $k) { $v = htmlentities($v, ENT_QUOTES); };
 
$fonctions_entrantes = array($addslashes, $htmlentities);
 
if (isset($_SESSION)) {
     foreach($fonctions_entrantes as $fct_in) {
       array_walk_recursive($_SESSION, $fct_in);
    }
}
 
?>
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 23h07   #10
Membre habitué
 
Homme
Enseignant
Inscription : avril 2002
Messages : 300
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France, Vosges (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : avril 2002
Messages : 300
Points : 100
Points : 100
Et voilà ! ca ne fonctionne pas !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function addslach(&$item)
	{
		$item=addslashes($item);
	}
 
 
	$liste = array("a", "sfds'sdf", "rree'  eeer' efqsd");
	$liste2=array($liste, "ee're", "ttt'lkk");
 
	echo "<pre>";
	print_r($liste2);
	echo "</pre>";
	array_walk_recursive($liste2, "addslach");
 
	echo "<pre>";
	print_r($liste2);
	echo "</pre>";
bastien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 23h16   #11
Membre éclairé
 
Inscription : juin 2007
Messages : 337
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 337
Points : 393
Points : 393
c cado :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
function Rec_json_encode_parse_Array_recursive(&$item, $key)
{
        if (is_string($item)) {$item = mb_encode_numericentity($item, array (0x80, 0xffff, 0, 0xffff), 'UTF-8');}
}
 
 
function json_encode_parse_Array_recursive($arr)
{
         //convmap since 0x80 char codes so it takes all multibyte codes (above ASCII 127). So such characters are being "hidden" from normal json_encoding
        array_walk_recursive($arr,"Rec_json_encode_parse_Array_recursive");
        return mb_decode_numericentity(json_encode($arr), array (0x80, 0xffff, 0, 0xffff), 'UTF-8');
 
}

moi je m'en sert pour transferer des donnée AJAX, qui modifie tous les segments
__________________
Conception / Dev
ascito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 00h08   #12
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 554
Points : 2 554
Envoyer un message via Skype™ à rawsrc
J'ai oublié de préciser qu'il était possible de faire encore plus simple :
Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
 
$filter = function(&$v, $k) {
   $v = addslashes($v);
   $v = htmlentities($v, ENT_QUOTES);
};
if (isset($_SESSION)) {
   array_walk_recursive($_SESSION, $filter);
}
 
?>
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/01/2012, 00h10   #13
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
Citation:
Envoyé par bastien Voir le message
Et voilà ! ca ne fonctionne pas !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function addslach(&$item)
	{
		$item=addslashes($item);
	}
 
 
	$liste = array("a", "sfds'sdf", "rree'  eeer' efqsd");
	$liste2=array($liste, "ee're", "ttt'lkk");
 
	echo "<pre>";
	print_r($liste2);
	echo "</pre>";
	array_walk_recursive($liste2, "addslach");
 
	echo "<pre>";
	print_r($liste2);
	echo "</pre>";
la réponse peut-être :
Citation:
Dans tous les cas voici comment faire pour ne pas avoir à s'occuper de la récursivité, PHP 5.3+ bien évidemment :
chez moi ton code marche...
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 00h33   #14
Membre éclairé
 
Inscription : juin 2007
Messages : 337
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 337
Points : 393
Points : 393
Citation:
Envoyé par rawsrc Voir le message
J'ai oublié de préciser qu'il était possible de faire encore plus simple :
Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
 
$filter = function(&$v, $k) {
   $v = addslashes($v);
   $v = htmlentities($v, ENT_QUOTES);
};
if (isset($_SESSION)) {
   array_walk_recursive($_SESSION, $filter);
}
 
?>
je test pas ce soir, mais j'aime +1
__________________
Conception / Dev
ascito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2012, 18h41   #15
Membre habitué
 
Homme
Enseignant
Inscription : avril 2002
Messages : 300
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France, Vosges (Lorraine)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : avril 2002
Messages : 300
Points : 100
Points : 100
Je vous remercie.
bastien est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h44.


 
 
 
 
Partenaires

Hébergement Web