现在有很多文件托管网站 ( uploading websites
),例如每次完整下载某个文件的点数。
我的问题 我想了解他们使用的想法是什么!
它如何只依靠文件的完整下载?!我的意思是如果我在文件开始后取消下载文件,它不会计分!它是怎么知道的!是否有任何 php 函数能够知道我是否取消了下载某些确切的文件!
这个问题一直在我脑海中思考并思考,但我无法理解它是如何工作的,或者它背后的想法是什么。~ 谢谢
现在有很多文件托管网站 ( uploading websites
),例如每次完整下载某个文件的点数。
我的问题 我想了解他们使用的想法是什么!
它如何只依靠文件的完整下载?!我的意思是如果我在文件开始后取消下载文件,它不会计分!它是怎么知道的!是否有任何 php 函数能够知道我是否取消了下载某些确切的文件!
这个问题一直在我脑海中思考并思考,但我无法理解它是如何工作的,或者它背后的想法是什么。~ 谢谢
这可以通过使用我的其他答案作为基础来完成如何授予对 public_html 目录之外的文件的下载访问权限?并替换readfile( $filename )
为readfileWhileConnected( $filename )
:
/** Read $filename until EOF or disconnect,
* if disconnect then error_log() count of bytes read already
*/
function readfileWhileConnected( $filename ) {
// Save and set ini values:
$user_abort = ignore_user_abort();
ignore_user_abort(false);
// Get file size and set bytes_sent to zero:
$fsize = filesize($filename);
$bytes_sent = 0;
// Open file:
$f = fopen($filename, 'r');
// Read file:
while($chunk = fread($f, 1024)) {
// Check if connection is still open:
if(!connection_aborted()) {
// Send $chunk to buffer (if any), then flush() buffers:
echo $chunk;
flush();
// Add $chunk length to $bytes_sent
$bytes_sent += strlen($chunk);
} else {
// Close file:
fclose($f);
error_log("Connection closed at $bytes_sent/$fsize");
exit();
}
// Close file:
fclose($f);
// Reset ini values:
ignore_user_abort($user_abort);
return $bytes_sent;
}
}
在您class myNewSuperDownloadHandlerClass { ... }
准备好新的闪亮之后,请确保您仅通过此处filedownload.php
描述的方式提供下载,或者如果做得很好,然后使用它,只需确保用于需要连接状态轮询的每个下载。myNewSuperDownloadHandlerClass()
readfileWhileConnected()
如果用户关闭连接,您可以轻松添加要触发的回调,这里只有 2 个退出点。(看到了很多经常有的功能return false; return true; return null; return false; return true;
等等..)