Alex
2007-03-02 01:02:05 UTC
Bonjour,
J'écris actuellement un petit script php pour transférer
des fichiers d'un serveur vers les clients (web).
Ca marche bien sur des petits fichiers, le problème arrive
sur des gros fichiers (j'ai testé sur un de 1Go), le
transfert s'arrête aléatoirement au bout de quelques
dizaines de secondes (des fois le téléchargement est arrivé à
30%, d'autre fois à 75%,...).
Et je comprends vraiment pas pourquoi...
Voici un bout de mon script:
- D'abord j'envoie les headers http
header('HTTP/1.1 200 OK');
header('Status: 200 OK');
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Expires: ".gmdate("D, d M Y H:i:s", mktime(date("H")+2,
date("i"), date("s"), date("m"), date("d"), date("Y")))." GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header('Accept-Ranges: bytes');
header('Content-Transfer-Encoding: Binary');
header('Content-Type: application/force-download');
//header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
//header("Content-Disposition: inline; filename=$name");
header('Content-Length: '.$length);
- Ensuite je boucle pour envoyer le fichier
(et j'écris en même temps un fichier de debug sur le server)
$fd = fopen("debug.txt", "a");
fwrite($fd, "start of transfert\n");
fclose($fd);
while(true) {
if (connection_aborted()) {
$fd = fopen("debug.txt", "a");
fwrite($fd, "connection aborted\n");
fclose($fd);
break ;
} else if (connection_status() != 0) {
$fd = fopen("debug.txt", "a");
fwrite($fd, "connection status\n");
fclose($fd);
break ;
} else if (feof($fp)) {
$fd = fopen("debug.txt", "a");
fwrite($fd, "end of file\n");
fclose($fd);
break ;
} else {
print(fread($fp, 1024*8));
flush();
}
}
$fd = fopen("debug.txt", "a");
fwrite($fd, "end of transfert\n");
fclose($fd);
Alors déjà, première constatation, le
header('Content-Length: '.$length);
retourne bien la bonne taille à l'octet pret!
(wget mon_script.php indique bien la bonne taille à
télécharger).
Ensuite, quand j'ouvre le fichier "debug.txt", la
seul chose de marquer est:
"start of transfer
start of transfer
start of transfer
..."
(la commande wget relance le téléchargement quand
le transfert à été interrompu, d'ailleurs celui-ci
marque: "connection closed").
j'ai essayé en essayant de commenter mes 2 tests
sur connection_aborted() et connection_status(),
mais meme erreur de perte de connection de la part
du client.
Idem en essayant de lire non par bloc de 1024*8
mais seulement de 1024.
Quelqu'un aurait-il une idée?
Merci
J'écris actuellement un petit script php pour transférer
des fichiers d'un serveur vers les clients (web).
Ca marche bien sur des petits fichiers, le problème arrive
sur des gros fichiers (j'ai testé sur un de 1Go), le
transfert s'arrête aléatoirement au bout de quelques
dizaines de secondes (des fois le téléchargement est arrivé à
30%, d'autre fois à 75%,...).
Et je comprends vraiment pas pourquoi...
Voici un bout de mon script:
- D'abord j'envoie les headers http
header('HTTP/1.1 200 OK');
header('Status: 200 OK');
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Expires: ".gmdate("D, d M Y H:i:s", mktime(date("H")+2,
date("i"), date("s"), date("m"), date("d"), date("Y")))." GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header('Accept-Ranges: bytes');
header('Content-Transfer-Encoding: Binary');
header('Content-Type: application/force-download');
//header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
//header("Content-Disposition: inline; filename=$name");
header('Content-Length: '.$length);
- Ensuite je boucle pour envoyer le fichier
(et j'écris en même temps un fichier de debug sur le server)
$fd = fopen("debug.txt", "a");
fwrite($fd, "start of transfert\n");
fclose($fd);
while(true) {
if (connection_aborted()) {
$fd = fopen("debug.txt", "a");
fwrite($fd, "connection aborted\n");
fclose($fd);
break ;
} else if (connection_status() != 0) {
$fd = fopen("debug.txt", "a");
fwrite($fd, "connection status\n");
fclose($fd);
break ;
} else if (feof($fp)) {
$fd = fopen("debug.txt", "a");
fwrite($fd, "end of file\n");
fclose($fd);
break ;
} else {
print(fread($fp, 1024*8));
flush();
}
}
$fd = fopen("debug.txt", "a");
fwrite($fd, "end of transfert\n");
fclose($fd);
Alors déjà, première constatation, le
header('Content-Length: '.$length);
retourne bien la bonne taille à l'octet pret!
(wget mon_script.php indique bien la bonne taille à
télécharger).
Ensuite, quand j'ouvre le fichier "debug.txt", la
seul chose de marquer est:
"start of transfer
start of transfer
start of transfer
..."
(la commande wget relance le téléchargement quand
le transfert à été interrompu, d'ailleurs celui-ci
marque: "connection closed").
j'ai essayé en essayant de commenter mes 2 tests
sur connection_aborted() et connection_status(),
mais meme erreur de perte de connection de la part
du client.
Idem en essayant de lire non par bloc de 1024*8
mais seulement de 1024.
Quelqu'un aurait-il une idée?
Merci
--
Alex
Alex