2011-08-19 61 views
1

我在页面中有一些过程。它正在下载一个文件。PHP中的过程完成后重定向页面

<?php 

// getting file with CURL 
     $ch = curl_init ('http://adress.com/file.csv'); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); 
    curl_setopt($ch, CURLOPT_TIMEOUT,7500); 
    $rawdata=curl_exec($ch); 
    curl_close ($ch); 
// End Curl Process 

// SAVE FILE 
    $name = Rand(100000,1000000); 
    $fp = fopen('files/'.$name.'.csv','w'); 
    fwrite($fp, $rawdata); 
    fclose($fp); 

// END SAVE PROCESS 

// REDIRECT OTHER PAGE 
     **header('Location: x.php');** 
// END OF PAGE 

?> 

这是好事。但有一个问题。它重定向没有完整的过程。我想在所有进程完成后重定向。当我使用该方法重定向时,该文件是空的。

我该做什么?如何在所有过程完成后重定向页面? PHP或JavaScript/jQuery。

+4

你怎么知道所有的过程都没有完成?此代码应该按顺序运行 –

+0

问题不能是您的重定向 - 它发生在文件已被写入时。它一定是别的东西。如果您删除标题行,您是否确定它有效? –

+0

是的,它可以工作,如果我不重定向页面。 文件很大(40-50 MB)。关于超时,一切都可以。它的工作,如果我不重定向,如我所说。但我必须重定向其他进程(将其上传到某处)。 – Benjamin

回答

2

你的代码应该是罚款,并重定向前,应完成该过程。

PHP运行在一个单独的线程中,所以下一个语句直到前一个语句完成才会被执行。这意味着您的header()行将不会执行,直到fwrite()写完文件。

事实上,设置Location标头甚至不意味着PHP脚本停止。您可以通过创建一个虚拟文件并在发出Location标题后对其执行unlink()来测试。该文件仍将被删除。 Location所做的就是向您的浏览器发送一个新位置。然后,您的浏览器会在旧版本运行之前检索新页面。

1

您可以设置睡眠(秒)并检查它是否足以完成整个过程。

您也可以把一个简单的检查:

$start_size = 0; 
while (1) { 
    $new_file_size = filesize($filename); 

    if ($start_size != $new_file_size) { 
     $start_size = $new_file_size; 
     sleep(30) 
    } else { 
     break; 
    } 
} 
+0

谢谢大家。 标题位置功能在所有处理完成后起作用。问题是脚本的其他部分。对不起,再次感谢您的快速选择。 – Benjamin

1

如果没有文件返回给客户端,你可以做到以下几点:

ignore_user_abort(); 
    header("Content-Length: 0", true, HTTP_RESPONSE_204_NO_CONTENT); 
    header("Connection: close", true); 
    flush(); 

这将控制返回给客户端并关闭浏览器连接,但服务器端进程会继续工作。

但是,我同意@AgentConundrum在其他进程完成之前不会执行header()行。

2

我认为设置一个回调,当头完成是最好的解决方案。

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://www.php.net/'); 

// here is the hack - Set callback function for headers 
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header'); 

curl_exec($ch); 
curl_close($ch); 

//Callback function for header 
function read_header($ch, $string) 
{ 
    if (trim($string) == 'HTTP/1.1 200 OK') 
     header("location: http://www.php.net"); 
}