2011-11-09 32 views
4

當會話以PHP腳本結束時,是否可以運行函數?我的腳本提出了幾個問題,用戶有30分鐘的時間回答或會話過期。我想我的腳本任何進展保存到一個文本文件如果會話過期,並且用戶還沒有完成所有的答案。我會如何去做這件事?會話過期時運行一個函數嗎?

我聽說register_shutdown_function( '關機');但我對我在腳本中的位置感到困惑。

我現在的腳本啓動這樣的:

ini_set('session.gc_maxlifetime',1800); 
ini_set('session.gc_probability',1); 
ini_set('session.gc_divisor',1); 
session_start(); 
if($_SESSION['loggedin'] !== 1) {//checks to see if user has logged in 
header('Location: login.php'); 
exit;} 

...asks a bunch of questions.... 
session_destroy(); 

感謝您的幫助。

回答

3

實際上,你有兩種選擇:

  1. 保存進度,當它發生(每一個答案後),以及是否已經完成保存信息。即使瀏覽器已關閉,此解決方案仍可正常工作(實時保存進度)。

  2. 使用AJAX調用每一個例如服務器。 5秒,無論會話是否結束,服務器都應該返回信息。如果會話結束,然後在JS中做你需要的(甚至重定向到不同的頁面)。此解決方案不能確保保存進度(在執行操作之前可能會關閉瀏覽器)。

根據您需要的和您的應用程序的工作方式,您可以組合這兩個選項。

如果每一個答案後重新加載頁面(例如重新加載,顯示下一個問題),那麼你可以使用選項沒有。 1。如果所有問題都在一頁上,請選擇選項編號。 2。如果您的應用程序是兩者的組合,您可以選擇這兩個選項。

編輯:

從你的代碼來看,你混合:

  • 會議在時間方面在條件回答問題
  • 會議在PHP的頁面請求之間存儲值。

最好的想法是將兩者分開。給PHP會話一個更大的時間限制,因爲它需要一些其他的東西,比如實際顯示進度甚至保存進度。相反,標記測試開始的時間並將其存儲在PHP會話中。這種方式在測試時間耗盡後,您將能夠確定並忽略此後回答的任何問題。

1

有一對夫婦的立即浮現在腦海中的方法。你可以使用建立在sleep方法中的PHP,或者你可以使用AJAX。不要說這些是唯一的方法,只是第一個想到的。

編輯:現在,我想想,睡眠可能不是,因爲這將超出最大運行時間,並拋出一個錯誤的選擇。沒有測試確定,但似乎合乎邏輯。所以AJAX是你最好的選擇,假設我沒有失去任何東西。

+0

你說得對,'sleep()'不是這裏的選項。如果使用Comet(AJAX長輪詢)而不是傳統的AJAX,這可能是一個選項,但這只是大型解決方案稱爲長輪詢的一小部分。 – Tadeck