2011-08-19 65 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"); 
}