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

ZF : envoyer des images embarquées dans un mail

Dans mon précédent article, je vous ai présenté comment envoyer un mail avec une pièce jointe. Dans la même ligné, je vais vous montrer ici comment envoyer des pièces jointes en ligne.

Qu’est qu’une pièce jointe embarquée ?

Le principe est d’attacher le fichier directement à l’intérieur du mail. Si vous créer un lien interne vers ce fichier, vous ne le verrez alors pas en tant que pièce jointe à télécharger. Ce système présente des avantages comme des inconvénients.
Lire la suite

ZF : Comment envoyer un mail avec une pièce jointe ?

Introduction

Que ce soit pour la confirmation d’inscription ou pour une newsletter, à un moment ou un autre, vous devrez envoyer un mail.

Mais cette tâche peut devenir compliquée, et encore plus s’il vous prend l’idée d’envoyer une ou plusieurs pièces jointes avec votre mail.

Heureusement, des bibliothèques existent et permettent d’éviter de concevoir notre propre code. Étant utilisateur de Zend Framework, je vais vous présenter comment envoyer des mails accompagnés de pièces jointes en utilisant ce dernier. Vous verrez alors la simplicité de la chose.
Lire la suite

Fonction PHP du jour : array_chunk()

Nous avons vu précédemment la fonction Levenshtein, permettant de calculer une distance entre deux mots.

Aujourd’hui, je vais vous présenter la fonction array_chunk(). Pour les « pros » de PHP, cela ne sera peut-être pas intéressant, mais même après des années de programmation, on passe parfois à coté de fonctions pouvant se révéler bien utiles.
Lire la suite

Comment éviter le contenu dupliqué avec « domain.tld » et « www.domain.tld »

Les moteurs de recherche (du moins, Google) considère les sous-domaines comme des sites à part entière. C’est un point très important à connaître.

Parfois, les deux adresses principales d’un site, par exemple « www.programmation-web.net » et « programmation-web.net » sont configurées pour pointer sur le même site web. Le problème est que celle-ci peuvent se retrouver référencées par les moteurs de recherche. Le risque est d’avoir du contenu considéré comme dupliqué. Le poids du référencement pourrait alors être divisé.

Afin de palier à cela, il suffit de choisir quel nom de domaine vous souhaitez officiellement utiliser pour votre site web et de rediriger l’autre vers ce dernier. Pour mon site, j’ai choisi d’utiliser directement la racine du domaine, à savoir programmation-web.net. Toutefois, un visiteur pourrait rapporter sur un forum, ou encore son blog, l’adresse suivante : www.programmation-web.net qui redirige aussi sur ce site.

Nous allons donc rediriger le sous domaine vers l’adresse racine. Pour ce faire, j’utilise simplement le mod_rewrite d’Apache. Vous devrez donc adapter selon votre environnement. Allons-y.

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.programmation-web.net$
RewriteRule (.*) http://programmation-web.net$1 [NC,L,QSA,R=301]

# si vous préférez garder www.programmation-web.net
RewriteCond %{HTTP_HOST} ^programmation-web.net$
RewriteRule (.*) http://www.programmation-web.net$1 [NC,L,QSA,R=301]

Avec ces règles, toutes les requêtes effectuées via « www.programmation-web.net » seront redirigées vers « programmation-web.net ». Nous gardons en plus de cela la ressource demandée (ce qu’il y a derrière l’adresse), afin que cela soit totalement transparent pour le visiteur ainsi que les robots.

Il est très recommandé de mettre une redirection permanente (R=301) afin d’indiquer que l’adresse redirigée n’est pas à utiliser.

Vous pouvez utiliser la même technique pour le changement d’adresse d’un site web.

RewriteCond %{HTTP_HOST} ^www.ancien-site.net$
RewriteRule (.*) http://www.nouveau-site.fr$1 [NC,L,QSA,R=301]

Voilà, rapide et efficace.

Zend Framework 1.11.1 à télécharger

Une petite note pour la sortie de la première version de maintenance de la version 1.11 de Zend Framework.

Cette version numérotée 1.11.1 corrige environ 80 bugs. Consultez le changelog pour le détail complet des changements.

Référencement : attention à l’historique Google

Suite à un sujet sur le forum WebRankInfo sur un probable problème avec l’algorithme de Google, j’écris cet article qui pourra certainement servir à d’autre personne.

Lorsque vous travaillez sur le référencement de votre site web, vous testez certainement votre travail en examinant les résultats de recherche sur les différents moteur de recherche, dont Google.

C’est dans ce dernier qu’il faut faire attention. Comme mentionné dans le sujet du forum, vous pourriez voir apparaître soudainement votre site web en première position sur un navigateur, alors que d’autre navigateur vous l’afficherait sur la deuxième, troisième voir quatrième page de résultat.

Non, ce n’est pas un bug dans le navigateur, c’est tout simplement que vous avez probablement la fonctionnalité d’Historique de recherche d’activée. Alors pas de panique, nous allons remédier à cela.
Lire la suite

Comment gérer simplement la mise en cache navigateur ?

MaJ 17/03/2011 : pour ceux qui ont déjà lu l’article, j’ai déplacé le numéro de version (avant, mis comme un répertoire) dans le nom du fichier. C’est plus propre pour les URLs relatives des fichiers CSS.

Les fichiers ressources, dits statiques, sont des fichiers dont le contenu ne change pratiquement jamais. C’est le cas des fichiers CSS, JavaScript, images, etc.

Donc, il peut s’avérer utile, voir indispensable, de les stocker en cache. Cela permet à la fois :

  • de préserver la bande passante.
  • et de limiter les requêtes inutiles. Ce qui accélère l’affichage des pages et surtout libère le serveur. Ce dernier peut s’occuper de chose plus importante.

Le fonctionnement courant est l’échange d’entêtes Last-Modified/If-Modified-Since ou encore ETag/If-None-Match. Mais nous verrons une autre solution que j’utilise.
Lire la suite

PHP / MySQL : comment résoudre les problèmes d’accents ?

Introduction

Le jeu de caractères est un point très important à connaître avant même d’écrire le premier bout de code d’un site web. Si vous négligez cette partie intégrante du développement, alors vous courrez à des risques d’incompatibilité qui se traduirons par l’apparition de caractères ressemblant à cela : é, �.

Nous allons voir dans cet article les points les plus importants à connaître pour partir du bon pied dans le développement de votre projet.

Lire la suite