2011-12-20 130 views
4

我偶然發現了一個有趣的問題。我正在使用Symfony2。簡化的問題如下。有兩個動作,每個在routing.yml中都有一個路徑。第一動作執行此:Symfony2並行處理

return new \Symfony\Component\HttpFoundation\Response("first"); 

第二動作執行此:

$start = time(); 
while(time()-$start < 25); 
return new \Symfony\Component\HttpFoundation\Response("second"); 

第二操作運行25秒的循環,然後返回。

我打電話給第二個動作:domain.com/second(當然需要時間來加載),同時我打開另一個瀏覽器窗口並輸入:domain.com/first。這應該讓我一眨眼的結果,然而,即使第一個動作等待,直到第二個完成,他們給我的結果在同一時刻。這在開發和生產模式中都會發生。我假設這兩個過程應該自己運行。如果不是第一個動作,我會調用一個純PHP腳本(不是Symfony),它會立即返回而不用等待。另外,如果我在不同的瀏覽器中運行第一個和第二個操作,我不必等待第一個加載。

什麼可能導致問題?上述問題被簡化爲了解,但是,如果解決了這個問題,我的原始的,更復雜的任務也會起作用。

謝謝您的幫助:大衛

回答

3

默認情況下($_SESSION)PHP會話存儲在文件中。在建立連接並調用session_start時,將打開並鎖定用戶會話文件。

因此,現在通過同一用戶/會話的其他連接不能被處理,直到會話被解鎖。

這可能是(不是絕對)你遇到的情況。

查看更詳細的運行http://00f.net/2011/01/19/thoughts-on-php-sessions/http://konrness.com/php5/how-to-prevent-blocking-php-requests/通過

+0

非常感謝您!會議是問題的根源。 session_write_close()解決了它。 – 2011-12-20 05:04:24