我正在尝试编写一个脚本,该脚本将在服务器上创建一个文件,然后使用header()
将用户重定向到该文件。然后,大约10秒后我想删除该文件。我试过这个:
header('Location: '.$url);
flush();
sleep(10);
unlink($url);
但浏览器只是等待脚本完成然后被重定向,但该文件已被删除。有没有办法告诉浏览器“文件结束”,然后继续计算?或者让PHP启动另一个脚本,但不要等待该脚本完成?
答案 0 :(得分:4)
您可能最好让PHP页面提供文件。在这种情况下无需创建临时文件并将其删除,只需将要写入的数据发送到临时文件即可。您需要正确设置标头,以便浏览器可以识别您要发送的文件类型。即Content-Type:text / xml;对于jpg的xml或image / jpeg。
此方法还处理下载文件需要更长时间的慢速客户端。
答案 1 :(得分:1)
到目前为止,我发现这样做的唯一方法是在标题中提供内容长度。尝试添加:
header("Content-Length: 0");
在你的冲洗()之前;
答案 2 :(得分:1)
http://us2.php.net/ignore_user_abort
使用它时要非常小心,你可以通过滥用来快速杀死服务器。
答案 3 :(得分:1)
或者....而不是动态地动态生成文件......为什么不像这样制作一个处理程序:
tempFile.php?key = {md5 hash}
tempFile.php然后查询数据库,内存缓存(带有额外的前置密钥)或内容的apc。
答案 4 :(得分:0)
你可以尝试做那样的事情:
<iframe src="<?=$url?>"></iframe>
....
<?
sleep(10);
unlink($url);
?>
其他选项是使用curl - 然后在请求中加载文件并显示给用户。
问题 - 你想要删除用户无法拥有它的文件 - 我担心这是不可能的,当用户加载文件时,它在浏览器中是暂时的 - 所以他可以保存它。
下一个选项 - 如果您知道此文件的类型,则可以生成内容/类型标题,以便用户下载该文件。然后你删除它。
这只是简单的想法,不知道哪个适合你(如果有的话)
答案 5 :(得分:0)
如果您想实现原始设计,请阅读有关在PHP中运行命令的问题,即“火不会忘记”Asynchronous shell exec in PHP
答案 6 :(得分:-1)
你这是错误的方式。您可以创建文件并将其提供给他们,并一步删除它。
<?php
$file_contents = 'these are the contents of your file';
$random_filename = md5(time()+rand(0,10000)).'.txt';
$public_directory = '/www';
$the_file = $public_directory.'/'.$random_filename;
file_put_contents($the_file, $file_contents);
echo file_get_contents($the_file);
unlink($the_file);
?>
如果您这样做,文件会在用户看到后立即删除。当然,这意味着文件首先不需要存在。所以你可以将代码缩短到这个:
<?php
$file_contents = 'these are the contents of your file';
echo $file_contents;
?>
这一切都取决于您获取要展示的内容的位置。如果它来自文件,请尝试:
<?php
$file_contents = file_get_contents($filename_or_url);
echo $file_contents;
?>
至于自动删除文件,只需设置一个每10秒运行一次的cron作业,并删除temp文件夹中filemtime($ filename)大于5分钟秒的所有文件。