|
Posted by Alex on 03/02/07 00:22
Hello,
I'm trying to write a little php script to transfert some
files from a server to clients (web/http).
It's working fin with small files. But transfering big files
(try on 1Gb) failed! The transfert is stoped randomly (sometimes
at 25%, sometimes at 75%,...).
And I don't understand why?! :/
Here, a part of my php script:
- Firstly, I'm sending the http headers
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);
- After that, I have a loop to send the content of the file
(and I'm writing in same time a debuf file on the 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);
So, the first thing I've noticed is that
header('Content-Length: '.$length);
give the correct file size!
(wget my_script.php show the correct file size to be transfer).
The second thing is that the debug file contains only this:
"start of transfer
start of transfer
start of transfer
...."
(The wget command re-start the download of the file when
the transfer is closed before the end and the wget command
write on the screen: "connection closed").
I'm trying to delete the 2 tests (connection_aborted() and
connection_status()), but the same bug appears!
Identically bug when I'm trying to read the file not with
1024*8 block size, but with only 1024 size.
Someone has an genius idea for me?
Thanks (ans sorry for my bad english),
--
Alex
[Back to original message]
|