Taille max d'une variable de session

Eléphant du PHP | 441 Messages

13 janv. 2006, 16:06

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? :)
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Mammouth du PHP | 1311 Messages

13 janv. 2006, 19:44

salut

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

Mammouth du PHP | 983 Messages

13 janv. 2006, 23:03

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.

Eléphant du PHP | 441 Messages

16 janv. 2006, 11:35

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;
?>
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

16 janv. 2006, 11:54

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.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 441 Messages

16 janv. 2006, 11:56

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:
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

16 janv. 2006, 12:34

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?
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 1776 Messages

16 janv. 2006, 14:30

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

Eléphant du PHP | 441 Messages

16 janv. 2006, 14:57

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.
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Mammouth du PHP | 1311 Messages

17 janv. 2006, 09:11

si tu utilise un fichier, a tu fait des bench avec load data in file :?:

Eléphant du PHP | 441 Messages

17 janv. 2006, 10:24

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:
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Mammouth du PHP | 1311 Messages

17 janv. 2006, 11:00

:oops: j'avais pas vu que c'etait sous oracle

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

Eléphant du PHP | 441 Messages

17 janv. 2006, 13:22

: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
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Eléphant du PHP | 70 Messages

13 nov. 2006, 18:59

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