标题后延迟取消链接

时间:2018-01-19 11:23:17

标签: php unlink

我正在尝试为登录用户创建安全的文档检索系统。

首先,我检查用户是否已登录。如果是,我将把文件从服务器上的受保护目录复制到用户当前目录中的Web可访问空间。

然后我将它们重定向到文件现在所在的URL。告诉代码要休眠10秒钟以允许慢速连接时间来下载文件,然后将其删除,以便链接不再被其他人使用。

我的问题是在标题之后睡眠功能不起作用。我尝试删除if语句,这使脚本休眠10秒钟,然后取消链接文件,然后重定向用户,使链接已经破坏。

我很难找到让脚本睡眠10秒的方法,并且在重定向发生后仍然执行代码。

    <?php
if(!isset($_SESSION['id'])){
header("location:../../../");
}
else {
    echo copy('C:\directorypath\test.xls','test.xls');
    if(header("location:../docs/test.xls")){
    sleep("10");
    unlink("test.xls");
    }
}
    ?>

1 个答案:

答案 0 :(得分:3)

您尝试做的事实上实际上无法使用PHP,因为PHP是单线程的,并且从每个请求的开始到结束执行。这意味着在脚本中的所有代码完成之前,不会执行header重定向。这意味着脚本将首先等待,然后删除该文件,然后尝试重定向到不存在的文件。

相反,我的目的是另一种方法;使用和存储只能使用一次的唯一哈希。

检查用户是否已登录。如果他或她已登录,则生成唯一的哈希并将其插入数据库,例如INSERT INTO hashes (hash, used) VALUES ($myUniqueHash, 0)。然后将用户重定向到带有请求查询中的哈希的PHP文件,例如

header("Location: serve_file.php?hash=$myUniqueHash");

此文件将针对包含哈希的表检查$_GET['hash']的值,并检查used的值是否为0。如果是这种情况,它会将used列更新为1serve the file as a proxy。如果未找到哈希值,或者used列的值不是0,则会返回错误。

这样我们只能为登录用户提供一次(秘密)文件。