返回页面后继续运行php脚本

时间:2008-12-10 21:15:51

标签: php

我正在尝试编写一个脚本,该脚本将在服务器上创建一个文件,然后使用header()将用户重定向到该文件。然后,大约10秒后我想删除该文件。我试过这个:

header('Location: '.$url);
flush();
sleep(10);
unlink($url);

但浏览器只是等待脚本完成然后被重定向,但该文件已被删除。有没有办法告诉浏览器“文件结束”,然后继续计算?或者让PHP启动另一个脚本,但不要等待该脚本完成?

7 个答案:

答案 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分钟秒的所有文件。