2012-09-10 40 views
0

這裏是一個簡單的腳本,我測試過:爲什麼php頭文件(「location ...」)在腳本結尾執行?

<?php 

require 'dbcon.php'; 

header("location:http://google.com"); 

$time1 = time(); 

for($i=0;$i<=9999999;$i++){ 
    $j += $i * $i * $i * $i; 
} 

$time2 = time(); 

$total = $time2-$time1; 

mysql_query("insert into test values('$total')"); 

?> 

該腳本大約需要15秒來執行(所以15是插在我測試表),並且這些秒鐘後,頁面重定向太指定域。

我的問題是爲什麼會發生這種情況?

在我的真實代碼中,我想將用戶重定向到網頁,然後執行剩餘的代碼並存儲在數據庫中,因此用戶不必等待很長時間。它將如何完成?

UPDATE1: 請回答這個問題:
我想先重定向用戶,然後將數據插入到MySQL。例如我第一次獲得用戶的IP。那麼我想重定向他,然後從他的IP等檢測用戶國家,然後插入信息到MySQL。有可能嗎?

UPDATE2:
我想獲得用戶的國家和地區從其他網站與捲曲延伸,然後在數據庫中存儲。所以它需要幾秒鐘......

+1

如果您將用戶重定向到您的頁面之外,那麼您已經終止了該腳本,因此無法完成剩餘代碼的執行。 – Palladium

+0

當您更改了標頭()位置時,會阻止腳本的其餘部分執行。 – ariestav

+3

發佈這樣的標題使其成爲競賽條件。接收的瀏覽器將得到該重定向並關閉當前的條件,這將殺死你的腳本。一旦你發佈標題,你就有了不知多少時間來完成你的工作。 @ palladium:簡單地調用頭文件不會啓動重定向 - 只有在頭文件實際發送給客戶端時纔會啓動,客戶端可以是「現在」或「稍後」。 –

回答

5

header("Location: ...");只是設置標題,沒有更多。這就是爲什麼在設置位置標題之後,您應該總是使用exitdie(),除非您確切地知道您通過不執行操作獲得了什麼。

至於你想要做什麼,這是一個壞主意。刻意要求15秒的請求只是要求進行DOS攻擊。

+0

所以我該怎麼做?我想先重定向用戶,然後將數據插入到MySQL中。例如我第一次獲得用戶的IP。那麼我想重定向他,然後從他的IP等檢測用戶國家,然後插入信息到MySQL。有可能嗎? – Aliweb

+0

任何人都認爲'退出(0)'是好習慣嗎?我知道'exit === exit(0)'但值得指出。 – ficuscr

+0

@ali PHP頁面運行時間不應超過幾分之一秒。在重定向之前向數據庫添加一行應該沒有什麼區別。 –

-1

試試這個:

header("location:http://google.com"); 
exit; 

調用頭作品後退出。

+3

這不回答這個問題。 – Mike

+0

與我的問題沒有關係 – Aliweb