Bonjour,
nous sommes actuellement en train de mettre une partie de notre application en mode hors ligne (HTML5 indexeddb).
Lorsque l'utilisateur se connecte pour la première fois à notre application, on lance une requête AJAX afin de récupérer l'ensemble des données de l'utilisateur. La taille des données d'un utilisateur peut atteindre plusieurs 100aine de méga.
On a donc fait un script PHP pour récupérer l'ensemble des données des utilisateurs dans la base de données.
Mais lorsque la taille des données à récupérer est importante, on obtient unNous avons configuré dans php.ini la variable "memory_size" à 2G.Fatal error: Allowed memory size of 2147483648 bytes exhausted
Notre script PHP (simplifié pour les tests) :
Comme vous pouvez le voir, la mémoire utilisée passe de 7Mo en début de fichier à 551Mo à la fin, pour une seule requête SQL. Dès que je rajoute les autres requêtes pour les autres tables, j'ai l'erreur citée plus haut.
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 <?php // permet d'initialiser l'instanciation automatique des classes, la connexion vers Doctrine ... include_once 'bootstrap.php'; echo "Memory used: ".number_format(memory_get_usage())." bytes"; // Memory used: 7,241,280 bytes $output = array(); $output['records'] = array(); $output['deletedRecords'] = array(); $connection = $entityManager->getConnection(); // récupération de tous les enregistrements d'une table $statement = $connection->executeQuery(" SELECT EVT.`EVT_ID` as `id`, EVT.`EVT_NAME` as `name`, ... FROM `T_EVENT_EVT` EVT WHERE EVT.`USR_ID` = :userId ", array('userId' => $userId)); $output['records']['events'] = $statement->fetchAll(PDO::FETCH_ASSOC); // Retourne 100000 lignes environ echo "Memory used: ".number_format(memory_get_usage())." bytesnn"; // Memory used: 551,201,776 bytes @@ ?>
A quoi peut être dû cette augmentation de la mémoire et comment la régler ?
Sinon comment feriez vous pour récupérer toutes les données d'un utilisateur et les envoyer sur le poste client ?
Est ce que PHP est suffisement robuste pour ce genre de traitement ou doit on passer par un autre langage ?
En vous remerçiant,
Sébastien BORDAT
Partager