Site bloqué durant un téléchargement

C’est un problème que j’ai rencontré il y a de cela quelques temps déjà. Mais, apparemment, je ne suis pas le seul à tomber dans le « piège ».

Il est parfois nécessaire de créer un script de téléchargement pour des raisons diverses (statistiques, contrôle d’accès, etc.). Mais un problème peut subvenir en cours de téléchargement : il n’est plus possible de parcourir le site. On a l’impression que le site ne répond plus, et lorsque le téléchargement est terminé, tout se débloque.

J’ai mis du temps à résoudre le problème, mais il s’avère très simple. Tout tourne autour des sessions. En effet, comme l’indique la documentation de la fonction « session_write_close« , un verrou est mis sur les fichiers de session durant l’exécution du script, ce qui fait qu’il n’est pas possible d’avoir 2 requêtes HTTP simultanées. La seconde attendant que la première soit terminée (du moins, tant que les sessions sont encore ouvertes).

Quand le fichier à télécharger ne fait que quelques kilooctets, ce problème n’est pas visible. Par contre, dans le cas de téléchargement de gros fichiers (plusieurs mega), nous pouvons voir le blocage.

La solution est donc de libérer la session (la terminer) avant l’envoi des données. Ce qui donne par exemple :

session_start();

// code de contrôle, statistique, etc.

// envoi des en-têtes …
header('...');
header('...');
header('...');

session_write_close(); // les données de session sont écrites dans le fichier, et le verrou libéré.

readfile($fichier); // on envoi maintenant les données

Et voilà, normalement le problème disparait.

Mootools : utiliser sa modularité

Dans mes projets, j’utilise principalement Mootools en tant que framework JavaScript. Je me sens vraiment à l’aise avec celui-ci par rapport aux autres framework (ex: JQuery).

Pour le premier article, il sera question de la modularité de Mootools. Mais avant tout, je vais faire une courte présentation.

Présentation de Mootools

Comme écrit précédemment, Mootools est un framework permettant de coder en JavaScript sans se soucier des problèmes récurrents de la compatibilité entre les différents navigateurs. En outre, il ajoute des fonctionnalités afin de gérer des animations, effectuer des requêtes XmlHttpRequest, parcourir le DOM, et bien plus encore. Tout cela avec simplicité.

Bien entendu, dans un projet, nous n’avons pas systématiquement besoin de toutes les fonctionnalités fournies par le framework. Grâce à sa conception modulaire, il est possible de ne télécharger que le stricte minimum de code. C’est le sujet de cet article.
Lire la suite