Bonjour,

Je propose des fichiers en téléchargement et je viens de remarquer un gros problème : le téléchargement s'effectue bien mais les fichiers au dessus d'une certaine taille (je dirais 30 / 35 mo) font dans les 180 octets une fois le téléchargement terminé.
J'ai testé sur 2 PC (XP et Vista), sur IE7 et Firefox, même problème, que ce soit des .avi ou .mpg ou .zip.
Les fichiers sont hébergés sur un serveur dédié apache.
Est-ce que ça pourrait venir de la configuration du serveur ?
Je ne comprends pas ce qu'il se passe !

Merci de votre aide
Administrateur
Bonjour,

que contiennent ces 180 octest? Edite l'extension s'il le faut, en l'ouvrant avec PSPad ou tout autre éditeur de texte. Si c'est incompréhensible (pas du texte), les tout premiers octets peuvent être intéressants.

Comme limite, ça peut être un temps limite ou une quantité limite, dans Apache ou PHP ...
Bonjour,

J'ai édité le fichier et ça indique :

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 80259072 bytes) in <b>/home/site/public_html/acces.php on line 51

Voici le script de téléchargement (il s'agit du script fourni par Allopass) :


<?php 
$RECALL=$HTTP_GET_VARS["RECALL"]; 
if (trim($RECALL)=="") 
{ 
// La variable RECALL est vide, renvoi de l'internaute 
//vers une page d'erreur 
header("Location: erreur.html"); 
exit; 
} 

// $RECALL contient le code d'accès 
$RECALL = urlencode($RECALL); 

// $AUTH doit contenir l'identifiant de VOTRE document 
$AUTH = urlencode("54/75/456"); 

// $FICHIER_LOCAL doit contenir le chemin et le nom du fichier 
//à téléchargé présent sur votre site 
$FICHIER_LOCAL = "mes_fichiers/monfichier.zip"; 

// $FICHIER_INTERNAUTE doit contenir le nom du fichier qui sera créé sur 
//l'ordinateur de l'internaute 
// Ce nom ne doit pas être forcément le même que le nom du fichier local ! 
$FICHIER_INTERNAUTE = "lefichier.zip"; 

// envoi de la requête vers le serveur AlloPAss 
// afin de vérifier le code d'accès de l'internaute. 
// Dans la variable $r[0] on aura la réponse du serveur 
$r=@file("http://www.allopass.com/check/vf.php4?CODE=$RECALL&AUTH=$AUTH"); 

// on test la réponse du serveur 
if (ereg("ERR",$r[0]) || ereg("NOK",$r[0])) 
{ 
// Le serveur a répondu ERR ou NOK : l'accès est donc refusé 
header("Location: erreur.html"); 
exit; 
} 

// Le code est valide : on lance le téléchargement du fichier 
if (file_exists($FICHIER_LOCAL)==true) 
{ 
if (strstr($HTTP_USER_AGENT,"MSIE")) 
$attachment=""; 
else 
$attachment=" attachment;"; 

header( "Content-type: application/octet-stream" ); 
header( "Content-Disposition:$attachment filename=$FICHIER_INTERNAUTE"); 
header( "Content-Description: File Transfert" ); 
header( "Content-Length: ".filesize($FICHIER_LOCAL).""); 
readfile($FICHIER_LOCAL); 
exit; 
} 
?> 


Il a toujours fonctionné mais j'ai changé de serveur chez mon hebergeur recemment.

Voici la réponse de mon hébergeur justement à ce sujet :

nous avons eu exactement le même problème récemment avec un de nos client qui utilise le même système.
Ce qui semble se passer c'est que vos scripts chargent complètement les fichiers via PHP avant de les rendre disponible au téléchargement.
Ainsi, la limite de ressources mémoires allouée à PHP est très vite épuisée dès que les fichiers grossissent.
Je vous ai donc monté la valeur du memory_limit de PHP jusqu'à 256Mo au lieu de 32Mo.

Concrètement, cela implique que si demain vous mettez à disposition des fichiers de 300Mo, le téléchargement échouera comme avant.

Il risque donc d'être utile de revoir vos scripts afin d'utiliser la fonction readfile (ex: readfile($FICHIER_LOCAL)) avec plus de parcimonie.

Le problème a donc été réglé temporairement.


Il s'agirait donc bien du script qui ne fonctionnerait pas avec la configuration de mon serveur ou en tous cas emploierait donc maintenant trop de ressources.

Comment pourrais-je l'optimiser, en particulier pour la fonction readfile ?