2011-12-09 59 views
3

我相信一旦腳本或會話結束,globals和superglobals就會死亡。在PHP中存儲會話間變量的最佳方式是什麼?換句話說,我希望每個會話都有權訪問變量。 (這將是一個布爾值,用於同步對服務器資源的訪問。)除了將值存儲在文件中之外,是否有解決方案?這將是很好的保存在內存中的變量...PHP中的會話間變量

編輯:

我只是希望能夠做到這一點:

while ($beingused) 
    sleep(5); 
$beingused = true; 
// Do something 

SOLUTION:

非常感謝你的幫助。這是我的解決方案根據您的輸入。

memcache_pconnect('localhost'); 
while (memcache_get('inuse') == 'true') 
    usleep(10); 
memcache_set('inuse', 'true'); 
// Do something 
memcache_set('inuse', 'false'); 

UPDATE

其實我結束了一個文件解決方案,會後所有。每次用戶與應用程序進行交互時,都會根據用戶輸入提供一個腳本,該腳本會發生變化。我意識到腳本文件的存在可以作爲布爾值加倍,正如許多響應中所提示的那樣。

+1

什麼樣的資源?該資源是在用戶之間共享還是在網站訪問期間僅由一個用戶使用?一個價值千言萬語的例子。 –

+0

嗯,這是一個在服務器上運行的應用程序。每個用戶將通過shell_exec()命令與應用程序的同一個實例進行交互。命令完成得非常快,所以碰撞很少發生,但我想確保這一點。該布爾值將指示另一個用戶是否正在使用該應用程序。如果是這樣,該腳本可能會等待幾毫秒,然後再試一次。 –

+1

這還是比較模糊的。你在尋找*配置設置嗎? *數據庫*中的半永久入口? *信號量/鎖定/令牌*?這是用戶特定設置,機器特定設置還是全局設置? – deceze

回答

2

我會使用一個具有特定名稱的空文件(如Linux中的PID文件)。在執行命令之前,腳本會檢查文件是否存在,如果不存在,則會創建該文件。執行shell腳本後,刪除該文件。但要注意文件系統緩存。

另一個快速選項是將標誌存儲在內存數據庫(如memcache或Redis)中。

+0

OP特別要求「除了將值存儲在文件中」。 – Ben

+0

danielfaraday請求一個布爾變量。這就是PID文件可以執行的操作 - 如果文件存在=> TRUE,則shell腳本正在運行。如果它不存在 - FALSE,腳本沒有運行。無需在文件中寫入內容。 – Minras

+0

我認爲memcache聽起來像是最合理的解決方案。其他人聽起來有點哈克(文件系統和數據庫並不意味着存儲運行時變量)...感謝您的信息。我將研究memcache。 –

0

跨瀏覽器保存:使用cookie。要訪問它們,請使用$_COOKIE[]set_cookie()

保存在服務器上:使用數據庫字段。

UPDATE

儘管downvotes,你的更新後,似乎你可以只設置一個布爾值在數據庫中,並相應地檢查它的價值。毫無疑問,該頁面在數據庫中有一個條目 - 一個節點或一個日誌,或其他東西。

+0

... downvotes的原因? – Ben

+0

我沒有downvote,但我認爲一個原因是,餅乾不是問題的解決方案。數據庫(通常意味着關係數據庫)可以解決這個問題,但是這個過程非常緩慢且耗費資源。 – Minras

+0

@Minras - 謝謝,這很有道理。 – Ben

2

我想你根據你的問題需要的是用「內存數據庫」像SQlite in-memory database,或者使用MySQL Memory Storage engine

創建一個數據庫,但我不知道是否值得使用的內存數據庫僅用於保存一個變量。

查看更多詳細信息:http://en.wikipedia.org/wiki/In-memory_database

編輯:

OP的編輯後,看來他需要的是做一個特定的任務之前獲得鎖。 然後我認爲你也可以使用這些php 信號量相關的功能。

http://www.php.net/manual/en/function.sem-get.php

http://www.php.net/manual/en/function.sem-acquire.php

http://www.php.net/manual/en/function.sem-get.php

+0

是的,這將工作 - 但它似乎是一個布爾值矯枉過正。嗯... –

+0

@danielfaraday查看有關信號量的更新。但是我的原始投票是沒有問題的。正如你在下面的帖子中評論過的內存數據庫一樣。 –

0

之一PHP原則是無共享。這意味着你不能在兩個PHP執行/進程/請求處理之間共享任何東西。每個共享的東西都必須在PHP之外共享。

對於同一用戶的事情,你有會議。對於普通的共享,在傳統的LAMP安裝中,您有數據庫。但是你也可以使用文件系統(信號量,鎖)。使用數據庫來放置應用程序鎖是一件經典的事情,但它可能會給寫入操作相當慢的傳統關係數據庫造成不利影響。 Redis等一些NOSQL存儲引擎具有非常快速的鎖定操作支持。

+0

downvoting?任何原因? – regilero

+0

謝謝 - 我想我將會使用內存數據庫解決方案。它是最有意義的... –

+0

感謝您的謝意,但我認爲這不配得到-1 – regilero