2010-05-28 87 views
1

這可能是一個愚蠢的問題,但如何保存不特定於特定會話的變量。一個簡單的例子說明爲什麼你可能想要做到這一點將是一個訪客計數器 - 每次有人訪問一個網頁時增加一個數字(注意 - 我實際上沒有這樣做,我的應用程序是不同的,但這是我需要的功能)。我能想到的唯一方法是將變量寫入文件或將變量放入數據庫中。兩者都顯得有點不雅。有沒有更好的方式來這樣的事情?保存變量(不是會話)

+0

爲什麼文件和數據庫不雅? – thetaiko 2010-05-28 13:37:07

+0

當我只想存儲每個會話使用的一些變量時,它似乎不是一個整潔的選項。我只是想知道是否有另一種方式來做到這一點。 – 2010-05-28 13:45:08

回答

5

如果需要保存全局狀態,則需要保存全局狀態。正如您已經注意到的,這通常在文件或數據庫中完成。

+0

嗯。在asp.net中有應用程序狀態的概念,它基本上是一個由所有請求共享的內存緩存。如果你問我,這將是存儲當前在線用戶數量的理想場所。 – 2010-05-28 13:35:59

+0

問題:a)ASP很遺憾不是PHP。 b)應用程序狀態是不穩定的。這可能是也可能不是問題。在計數器的情況下,這將是一個大問題。不幸的是,在PHP中沒有什麼是應用程序狀態的直接模擬,所以對話有點不切實際。 – 2010-05-28 13:40:17

0

鑑於PHP是無狀態的,並且每個頁面負載基本上都是重新運行您的頁面,如果您要保存將在多個頁面負載(例如,不同用戶數量)上遞增的變量,您將擁有使用某種形式的服務器端存儲 - 基於文件,數據庫,不管 - 來保存變量。

2

這根本不是「不雅」。如果您需要永久保存某些內容(半),請將其放入數據庫中。這就是數據庫的用途。

1

看一看在PHP http://uk3.php.net/serialize序列化()函數,你就可以寫一個數組或對等文件並重新檢索:

<?php 
    // Save contents 
    $var = array('pageCounter' => 1); 
    file_put_contents('counter.txt', serialize($var)); 

    // Retrieve it 
    $var = unserialize(file_get_contents('counter.txt')); 
?> 

否則值保存到數據庫。

+0

是的,謝謝我已經在做一些非常相似的事情。 – 2010-05-28 13:40:47

0

你可以嘗試安裝這對於所有的PHP腳本之間共享數據很酷的功能,APC(替代PHP緩存),你可以嘗試使用共享內存過多或像你說的,使用一個文件或數據庫

+0

這是一個有趣的選項謝謝。 – 2010-05-28 13:42:19

0

如果你想它是永久的,數據庫和文件是你唯一的兩個選擇。

如果你只希望這些值暫時存儲在內存中,如果安裝APC,你可以這樣做:

// Fetch counter value back from memory 
$success = false; 
$counter = apc_fetch('counter', &$success); 
if ($success) { 
    // fetch succeeded 
} else { 
    // fetch failed 
    $counter = 0; 
} 

// Increment the counter and store again 
// Note that nothing stops another request/page from changing this value 
// between the fetch and store calls. 
$counter++; 
apc_store('counter', $counter); 

這只是一個例子。 對於計數器,最好使用apc_inc('counter')/apc_dec('counter')

推測其他操作碼緩存也有類似的方法。如果你沒有運行操作碼緩存......真的嗎?你希望PHP在每次請求時重新編譯一個頁面?

+0

非常感謝。很有意思。我會考慮的。 – 2010-05-28 13:46:10

+0

對不起,我忘了鏈接到這些頁面的手冊頁面。以下是php.net上的主要APC功能手冊頁面:http://www.php.net/manual/en/ref.apc.php – Powerlord 2010-05-28 13:47:40

0

我想我已經找到了答案 - session_name('whatever')可以用來爲會話指定一個固定名稱,我可以引用該數據以及特定於會話的會話。

0

優雅,沒有數據庫,沒有文件?

將其存儲在您的服務器內存中shmop並希望您的服務器不會重新啓動!