我遇到了一个奇怪的问题。我有一个使用passthru()进行下载的脚本-我想在用户下载文件时记录到数据库中。。。
要做到这一点,我在passthrough之前有register_shutdown_function(),但它在没有完全下载文件的情况下被调用。
<?php
// add to database that user is downloading file
// rest of code here
...
register_shutdown_function('download_ended');
passthru ("curl -r $start-$end --limit-rate 400K '$file'");
exit;
function download_ended(){
// remove from database download info
}
?>
即使文件仍在下载,函数download_ended()也会被调用。一旦文件完全下载或被用户中断,我如何从数据库中删除条目?
我会重写你的代码,并应用以下内容来完成文件传输完成过程的回调,从而有效地使用PHP的匿名函数(如果你使用的是PHP>=5.3.0):
<?php
$file = function($url, $path) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
return file_put_contents($path, $data);
};
if (FALSE !== $file('http://www.example.com/img.jpg', '/tmp/img.jpg')) {
download_ended();
}
注意,我使用了PHP的curl命令,而不是本机调用。
希望这对你的情况有所帮助。
根据您的问题判断,您希望限制上传速率,并在完成后进行一些数据库标记。您需要跳出CURL,依靠PHP的本机函数来完成这样的操作。
<?php
set_time_limit( 0 );
// do database stuff here
$of = fopen($file, "rb");
$dlrate = 400;
while(!feof($of))
{
print fread($of, round($dlrate * 1024));
flush();
sleep(1);
}
fclose($of);
// do more database stuff here
您可以使用时间戳来统计已删除的下载。