2011-09-10 34 views
0

我正在構建一個服務器端工作人員管理器腳本,它保存$ _SESSION中的「工作中的工作」數據,並且每次調用自己的下一個工作都要完成。這讓我可以控制,因爲我可以隨時停下並重新繼續。這很好。我遇到的問題是能夠在同一瀏覽器中運行一些這些經理,因爲他們共享$ _SESSION。所以我試圖創建一個二維$ _SESSION數組,根據我在http請求中指定的sessionId保存不同的數據。我想這樣做是爲了從同一瀏覽器運行多個抓取程序,一次只執行一項任務,並在其變量「$_SESSION[$sessionId]」中保留其餘任務的列表。所以我爲每個請求添加了一個sessionId,然後每個腳本都使用它。如果沒有sessionId,它會很好用,並且不能像我期望的那樣工作。我很難理解爲什麼。這是一個示例代碼來演示我的問題:

session_start(); 
$sessionId = $_REQUEST['sessionId']; 

if ($_REQUEST['currId'] == 0) { 
    unset ($_SESSION[$sessionId]); 
    $_SESSION[$sessionId]['log'] = "starting log for session " . $s; 
} 

if ($_REQUEST['currId'] < $_REQUEST['limit']) { 
    $_SESSION[$sessionId]['log'] .= " adding "; 

    // call with next currId 
    echo '<META HTTP-EQUIV="Refresh" CONTENT="1;URL=' . "'test3.php?limit=" . $_REQUEST['limit'] . "&currId=" . ($_REQUEST['currId']+1) . "&sessionId=" . $sessionId . "'" . '">'; 
} 

// reached limit 
else { 
    echo $_SESSION[$sessionId]['log']; 
}; 

我第一次調用調用test3.php?limit=5&currId=0&sessionId=0比期待與currId = 1,2,3,4,5代碼重新調用自身。好的。但是$ _SESSION並不保留,因爲我預計它會是 。當我刪除sessionId用法時,它確實起作用。但這種方式,我只能同時調用爬行,除非我打開其他瀏覽器...

感謝

+0

我不知道你在這裏試圖完成什麼。如果'test3.php'以某種方式負責啓動服務器端工作者,那麼讓它立即啓動所有這些工作。至於讓瀏覽器窗口做一些工作,很明顯,如果你繼續重定向它,那麼無論如何它一次只能做一件事。 – Jon

+0

由於服務器端工作人員數量巨大,我希望一次只能做一名工作人員。這樣我就可以隨時停止它,而不是繼續。這就是爲什麼我要在$ _SESSION中保存「需要完成哪些工作」的數據。現在這個工作很好,我只想添加一個選項來運行幾個這樣的共享相同$ _SESSION的工作經理。 – Noam

回答

2

你可能有更多的運氣與sessionId不是一個數字。如果您將錯誤報告與error_reporting(E_ALL);你會看到一些通知,其中一個是Notice: Unknown: Skipping numeric key 0 in Unknown on line 0

根據php pages上的一位評論者,這是由於使用整數作爲$_SESSION數組的關鍵字 - 當我嘗試這種方法時沒有錯誤消失。

你也有一個變量$s在那裏,我認爲應該是$sessionId,這也會發出通知。

+0

正是這樣。當我沒有使用數值時,它就起作用了!謝謝! – Noam

+0

沒問題,我從來沒有遇到過這種情況 - 我想知道爲什麼它不喜歡它 – Adam