Téléchargement, problème durée d'exécution
Posté : 19 nov. 2009, 17:56
Bonjour à tous;
Je viens vers vous pour un problème qui est assez prenant, et voir si quelqu'un parmi vous a une idée à me faire explorer. J'ai bien entendu utilisé la fonction "recherche", mais soit je suis manchot, soit cette fonction recherche est assez ardue à mettre en oeuvre...
Mon script est hébergé chez Free, c'est en Safe Mode, et la durée d'exécution du script ne peut dépasser 30s, limitation apparemment bien connue.
Je propose des fichiers de musique en téléchargement pour mon groupe. J'ai donc des fichiers parfois assez volumineux, et le temps que le transfert se fasse, le script arrête son exécution.
Voici la partie du script qui m'intéresse:
Pour permettre le téléchargement d'un gros fichier, je pense à 2 principes:
Création d'un dossier/fichier temporaire, avec un nom codé et sur lequel pointe un "simple" lien. Le dossier/fichier est créé par le script de download, avec une limitation temporelle associée en BDD, et nettoyage des dossiers/fichiers temporaires à l'aide d'une crontab. Ca ferait une manipulation de plus pour l'internaute (après avoir choisi le fichier à télécharger, il doit valider en cliquant sur un lien "temporaire") et cela peut multiplier les copies sur le serveur. Ca ne me plait qu'à moitié.
Relancer le script après 29s d'exécution par exemple. Là, je ne vois pas vraiment comment m'en sortir et reprendre le téléchargement en cours. Si quelqu'un a une idée à ce sujet, elle serait la bienvenue.
Merci d'avance à ceux qui voudront bien se pencher sur le problème.
Je viens vers vous pour un problème qui est assez prenant, et voir si quelqu'un parmi vous a une idée à me faire explorer. J'ai bien entendu utilisé la fonction "recherche", mais soit je suis manchot, soit cette fonction recherche est assez ardue à mettre en oeuvre...
Mon script est hébergé chez Free, c'est en Safe Mode, et la durée d'exécution du script ne peut dépasser 30s, limitation apparemment bien connue.
Je propose des fichiers de musique en téléchargement pour mon groupe. J'ai donc des fichiers parfois assez volumineux, et le temps que le transfert se fasse, le script arrête son exécution.
Voici la partie du script qui m'intéresse:
$p = '';
if (isset($_GET['p'])){
$p = $_GET['p'];
}
if ($p) {
// On n'autorise pas les chemins '..'
if (preg_match('/\.\./', $p)) {
Header ('Location: ./');
exit();
}
$sql="SELECT * FROM `download` WHERE `id` =".$p;
$result=mysql_query($sql) or die ('Problème avec la requête SQL');
while($row=mysql_fetch_array($result)){
$lien=$row['lien'];
$total=$row['total']+1;
}
// Code pour mettre a jour les stats de telechargements
$sql="UPDATE `download` SET `total` = '$total' WHERE `id` = '$p'";
$result=mysql_query($sql) or die ('Problème avec la requête SQL');
$path = $UploadDir . $lien;
if (!is_file($path)){
exit();
}
@ob_end_clean();
@ini_set('zlib.output_compression', 'Off');
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: public');
header('Content-Type: application/force-download');
header('Content-Type: application/octet-stream');
header('Content-Type: application/download');
header('Content-Disposition: attachment; filename="' . basename($path) . '";');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($path));
@readfile($path) or die("Fichier introuvable.");
$handle = fopen($path, 'rb');
do {
$data = fread($handle, 8192);
if (strlen($data) == 0) {
break;
}
echo($data);
} while (true);
fclose($handle);
exit();
}
else {
Header ('Location: ./');
}
Ce script fonctionne sans problème pour de petits fichiers, donc des temps d'exécution inférieurs à 30s.Pour permettre le téléchargement d'un gros fichier, je pense à 2 principes:
Création d'un dossier/fichier temporaire, avec un nom codé et sur lequel pointe un "simple" lien. Le dossier/fichier est créé par le script de download, avec une limitation temporelle associée en BDD, et nettoyage des dossiers/fichiers temporaires à l'aide d'une crontab. Ca ferait une manipulation de plus pour l'internaute (après avoir choisi le fichier à télécharger, il doit valider en cliquant sur un lien "temporaire") et cela peut multiplier les copies sur le serveur. Ca ne me plait qu'à moitié.
Relancer le script après 29s d'exécution par exemple. Là, je ne vois pas vraiment comment m'en sortir et reprendre le téléchargement en cours. Si quelqu'un a une idée à ce sujet, elle serait la bienvenue.
Merci d'avance à ceux qui voudront bien se pencher sur le problème.