Page 1 sur 1

Taille max d'une variable de session

Posté : 13 janv. 2006, 16:06
par starkeus
Bonjour à tous,
j'ai parcouru la doc sur les sessions et il ne me semble pas avoir vu de spécifications sur la taille maximale d'une variable de session. Est-ce que vous me confirmez qu'il n'y a pas de limite? Ou sinon m'éclairer sur le sujet?

J'explique pourquoi. J'ai un script d'importation de données. Mais l'enregistrement en base n'a lieu qu'à la validation par l'utilisateur. Donc je pensais stocker mes requêtes dans une variable de session de type tableau. Mais le problème est que potentiellement je peux avoir des milliers de requêtes, chacune de taille 500 caractères à peur près... donc pour 500 requêtes ça nous fait une variable contenant (rien qu'en donnée) 250 000 caractères grosso modo ...

:shock:

Deux solutions s'offrent à moi:
-stocker dans la session (avec cette inconnue qu'est la taille max) mais avec une lecture plus rapide lors de l'enregistrement en base
-stocker dans un fichier (le problème de taille est moindre) mais avec les temps d'accès au fichier peuvent jouer sur les perfs de l'enregistrement.

Qu'en pensez-vous? :)

Posté : 13 janv. 2006, 19:44
par jeff
salut

quelle est le contexte car vu le nombre de requete que tu doit faire de toute facon tu cherche pas la rapidité

Posté : 13 janv. 2006, 23:03
par rami
Pour sérialiser ses sessions, PHP fait de toute façon des accès fichier.
J'opterais plutôt pour un stockage fichier pour pas "saturer" la mémoire du serveur.

Ce qui serait interessant serait d'avoir un benchmark sur les accès disque en passant par la session, ou par des accès direct par fichier.

Posté : 16 janv. 2006, 11:35
par starkeus
Alors j'ai effectué un petit benchmarking des deux types d'accès:
Conclusion l'accès fichier semble être plus performant à quelques ms près.

Jeu de test:
500 requête
4 séries de 100 tests
Résultats:
-Fichier:
Moyenne Série 1 = 0.140
Moyenne Série 2 = 0.138
Moyenne Série 3 = 0.136
Moyenne Série 4 = 0.137
-Session:
Moyenne Série 1 = 0.185
Moyenne Série 2 = 0.160
Moyenne Série 3 = 0.160
Moyenne Série 4 = 0.162

Le code:
<?php
session_start();


for ($j = 0; $j < 100 ; $j++) {
	
	//$fichier = fopen("test.txt", "w");
	//ecriture
	//$tab=array();
	$_SESSION['tableau']=array();
	for ($i = 0; $i < 500 ; $i++)
		$_SESSION['tableau'][]="INSERT INTO DONNEE ( LCN_Z_CODE_PERIODE, LCN_LNS_ID_NIVEAU1, LCN_LNS_ID_NIVEAU2, GRO_ID, CHA_CODE,
	MOIS, VALEUR_ADMINISTRATEUR, VALEUR_ETABLISSEMENT, DATE_CREATION, USER_CREATION, DATE_MODIFICATION,
	USER_MODIFICATION ) VALUES ( 
	'PER2005', 47, 47, 1, 'CHAMP1', 0, NULL, NULL,  TO_Date( '01/01/2006 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM')
	, '01', NULL, NULL); 
	COMMIT;\n";
	/*fwrite($fichier, "INSERT INTO DONNEE ( LCN_Z_CODE_PERIODE, LCN_LNS_ID_NIVEAU1, LCN_LNS_ID_NIVEAU2, GRO_ID, CHA_CODE,
	MOIS, VALEUR_ADMINISTRATEUR, VALEUR_ETABLISSEMENT, DATE_CREATION, USER_CREATION, DATE_MODIFICATION,
	USER_MODIFICATION ) VALUES ( 
	'PER2005', 47, 47, 1, 'CHAMP1', 0, NULL, NULL,  TO_Date( '01/01/2006 12:00:00 AM', 'MM/DD/YYYY HH:MI:SS AM')
	, '01', NULL, NULL); 
	COMMIT;\n");*/
	$mt1 = microTime();
	echo "<pre>";
	print_r($_SESSION['tableau']);
	//$fichier = fopen("test.txt", "r");
	//while (!feof($fichier))
		//echo fgets($fichier);	
	echo "</pre>";
	$mt2 = microTime();
	$tempsCalcul = diffTime($mt1, $mt2);
	printf("Page generee en %2.3f secondes\n", $tempsCalcul);
	$tab[]=$tempsCalcul;
	unset($_SESSION['tableau']);
}
for ($i = 0, $taille=count($tab); $i < $taille ; $i++)
	$toto+=$tab[$i];
$moyenne=$toto/$taille;
echo "\nMOYENNE= ".$moyenne;
?>

Posté : 16 janv. 2006, 11:54
par sadeq
Ton microtime n°1 ($mt1) est mal positionné, il faut le placer avant la boucle des 500 c'est à dire de l'écriture pour compter aussi le temps d'écriture et non seulement celui du déstockage.

Posté : 16 janv. 2006, 11:56
par starkeus
Ton microtime n°1 ($mt1) est mal positionné, il faut le placer avant la boucle des 500 c'est à dire de l'écriture pour compter aussi le temps d'écriture et non seulement celui du déstockage.
Je ne suis pas vraiment d'accord car le temps d'écriture ne m'interessait pas. Je voulais seulement tester le temps de lecture :wink:

Posté : 16 janv. 2006, 12:34
par sadeq
C'est toi le chef mais je dirais que le temps d'écriture et de lecture constrituront une info plus complète pour la comparaison.

Eu, un autre truc, es-tu vraiment sûr que print_r utilisé pour lire la session effectue le même méchanisme que la lecture séquentielle de ton fichier ?

Ce qui est sûr et que chaque usage de $_SESSION[truc] effectue une lecture indexé dans le fichier de session. Ce qui fait un accès pour l'ensemble de ton tableau dans le fichier session.

Alors que dans le cas d'un fichier sans session le tableau est restitué ligne par ligne celà implique plusieurs accès

Alors vu tes stats, on comprend par ça que print_r combiné à $_SESSION effectuent d'autres tâches hors lecture qui les retardent?

Posté : 16 janv. 2006, 14:30
par DocType
Pour les 500 requêtes, tu n'as pas d'autre solution ? :?
Car c'est ça qui me choque surtout...
En étant seul sur ton site, ça va aller, mais met 20 personnes simultanées dessus, il va commencer à faire la tête...

Posté : 16 janv. 2006, 14:57
par starkeus
Pour les 500 requêtes, tu n'as pas d'autre solution ? :?
Car c'est ça qui me choque surtout...
En étant seul sur ton site, ça va aller, mais met 20 personnes simultanées dessus, il va commencer à faire la tête...
Ce n'est pas un site web mais une application intranet avec serveur dédié.
Et je n'ai pas vraiment le choix... les gens doivent importer des données dans le système via l'application, j'ai des tonnes de controles à faire dont les résultats doivent être afficher à l'utilisateur...et c'est celui-ci qui décide si oui ou non il enregistre les données dans la BD... donc j'ai 2 processus:
-le premier d'import et contrôle des données
-le second d'affichage des résultats des contrôles et d'enregistrement des données.
Cela implique forcément de stocker quelque part les requêtes qui seront éxécutées à l'enregistrement. A partir de là c'est soit la session ou un fichier pour le stockage.
Même si Sadek "met en doute" le benchmarking, sur le terrain ça se confirme ;) mais c'est clair que je vais devoir optimiser un max.

Posté : 17 janv. 2006, 09:11
par jeff
si tu utilise un fichier, a tu fait des bench avec load data in file :?:

Posté : 17 janv. 2006, 10:24
par starkeus
si tu utilise un fichier, a tu fait des bench avec load data in file :?:
c'est une fonction Mysql je ne sais pas s'il existe un équivalent Oracle. Je vais chercher. Merci pour le tuyau. :wink:

Posté : 17 janv. 2006, 11:00
par jeff
:oops: j'avais pas vu que c'etait sous oracle

un lien qui peut t'interesséhttp://jaouad.developpez.com/sqlldr/

Posté : 17 janv. 2006, 13:22
par starkeus
:oops: j'avais pas vu que c'etait sous oracle
je ne l'avais pas précisé non plus :wink:
un lien qui peut t'interesséhttp://jaouad.developpez.com/sqlldr/
Le seul point négatif est que cela soit un script à éxécuter... cela n'existe pas sous forme de requête? :D enfin bon je rêve je crois...
Merci

Suggestion

Posté : 13 nov. 2006, 18:59
par lemoineo
Je ferais le stockage en base de donnée comme prévu
mais en ajoutant un flag qui dirait que tant qu'il est faux, cela n'est pas valide
et après , quand tu reçois la validation, tu bascule ton flag ce qui n'est pas grand chose ...
Autre idée, creuser la notion de commit/rollback qui marche sur à peu près n'importe quelle SGBD. Vois la doc à ce sujet