2010-10-25 125 views
1

我把重定向代碼放在頁面的頂部,下面有引導代碼。重定向是否產生了一個不同的進程,使重定向頁面進程成爲後臺進程,或者完全殺死當前進程?在重定向上重定向的頁面被處理了嗎?

我使用header()進行重定向,但令人驚訝的是,需要數據庫連接的header()下面的剩餘代碼也被執行。這讓我好奇。

回答

2

首先,你應該永遠不會調用header()就這樣,除非你非常肯定的是,Drupal的助手是不恰當的(我從來沒有碰到過這樣的情況在我10年以上的Drupal開發)

header()將不會調用Drupal中的關閉和其他關閉函數,導致潛在的會話中斷,錯誤的統計信息和損壞的模塊(取決於正在調用的關閉)。在這種情況下,套接字和其他底層資源沒有關閉,甚至會在某些時候崩潰你的apache服務器(或其他服務器)。

如果您要設置標題,請撥打drupal_set_header()。九次你想要一個重定向標題,在這種情況下,你最好打電話drupal_goto(),這樣做會完成所有的關閉,甚至支持目標參數。

在drupal_goto上,所有進程都被終止(請參閱底部的exit()),因此不會保留正在運行的進程。 module_invoke_all('exit')將確保所有模塊在關閉它們的插座,連接以及其他方面都有所轉機。

+0

我將標題代碼放在index.php的頂部。這是否也會導致故障?事實上,我使用這個重定向將網站帶到維護頁面,因爲MySQL服務器需要停止一段時間。 – 2010-10-25 10:01:05

+0

位於index.php的頂部Drupal尚未加載,所以確實需要在其中運行header(),然後調用exit(),/ if /如果真的需要這樣做。我不信。你可以簡單地把一個叫做index.html的HTML頁面放在Drupal根目錄下,然後禁用或重命名.htaccess。如果您重定向,Google,書籤和服務將遵循重定向,並導致許多不需要的副作用。 – berkes 2010-10-25 12:05:39

0

據我所知,一個進程既參加原始請求,也參加重定向請求。一旦原始請求完成,重定向請求就會被處理。

由於URL重定向技術有很多,我們無法確定,除非您讓我們知道您使用的特定URL重定向技術。

0

從我的理解來看,如果直接從apache htaccess文件重定向,那麼不會創建新進程。如果使用header()函數,它將響應發送到apache服務器,並且apache重定向頁面。在這兩種情況下,都沒有創建新的流程;但後者在重新定向之前運行php腳本(更昂貴?)。