2012-12-13 210 views
0

我在使用PHP會話時遇到問題。會話被阻止

我使用AJAX嚮應用程序中的某個操作發送請求,該請求僅用於觸發進程的啓動。這個進程存儲在一個會話變量中。
問題是,我不能從另一個操作訪問這個變量,直到第一個操作完成。
事情是這樣的:

public function startWorkingAction() { 
$namespace = new Zend_Session_Namespace('progressOfWork'); 
$namespace->totalItems = 0; 
$namespace->processedItems = 0; 
//... processing items 
$namespace->totalItems = $itemCount; 
foreach($items as $item) { 
//process a single item 
$namespace->processedItems++; 
} 
} 

而且我還有一個行動檢查迄今取得的進展:

public function checkProgressAction() { 
$namespace = new Zend_Session_Namespace('progressOfWork'); 
echo json_encode(array( 
'total' => $namespace->totalItems, 
'processed' => $namespace->processedItems 
)); 
} 

兩個動作與AJAX請求觸發。問題在於,在第一個操作完成之前,我無法訪問會話名稱空間。
我哪裏錯了?

+0

AJAX以同步方式工作而不是異步。如果兩個Ajax請求都來自同一頁,那麼第二個請求會等待第一個完成。也許是錯的,但這是我通常觀察到的。除非你專門將它們設置爲async –

+0

,否則我會強制取消第一個請求(我只需要它就可以啓動該進程)。 – undefined

回答

1

問題是,我不能訪問會話名稱空間,直到第一個操作完成工作。我哪裏錯了?

你不是。這是使用默認「文件」handler的PHP會話的預期行爲。

根據session_start,PHP將在磁盤上存儲的會話文件上獲得exclusive file lock。僅當會話數據已寫入磁盤且文件已關閉時纔會釋放鎖定。沒有辦法在編寫自己的自定義會話處理程序之後禁用此行爲。

+0

感謝您的自定義會話處理程序鏈接。 – undefined

+1

您可能想要確保Zend Framework尚未爲您編寫一個。我隱約記得有一個存在,但Google只是拉起博客帖子,所以也許我誤解了。另請注意,如果您經常更改會話數據,則缺少鎖定會導致某些*怪異*「數據丟失」行爲。這是關於比賽條件...... – Charles

+0

Zend確實提供了鎖定和解鎖,但目前我無法使其工作。 – undefined