PHP: passthru and register_shutdown_function



我遇到了一个奇怪的问题。我有一个使用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

您可以使用时间戳来统计已删除的下载。

相关内容

  • 没有找到相关文章

最新更新