2012-05-30 57 views
5

我想在PHP中實現一個散列表(PHP中的關聯數組),它可用於應用程序範圍內,即將其存儲在應用程序上下文中,程序結束時不應該丟失它。我怎樣才能在PHP中實現這一點?在應用程序上下文中的散列表php

感謝,

+1

PHP本身沒有 '應用程序上下文'。有解決方法(即將文件存儲在文件或共享內存中),但除此之外,在PHP腳本執行結束時,沒有任何東西可以存活。 – zneak

回答

1

如果您使用的是Zend的PHP版本,那很容易。
您不需要序列化數據。
只有內容可以被緩存。諸如文件句柄之類的資源不能。 要存儲true/false,請使用1,0,以便您可以區分緩存失敗與===的結果。

商店:

zend_shm_cache_store('cache_namespace::this_cache_name',$any_variable,$expire_in_seconds); 

檢索:

$any_variable = zend_shm_cache_fetch('cache_namespace::this_cache_name'); 

if ($any_variable === false) { 
    # cache was expired or did not exist. 
} 

對於長期居住的數據,你可以使用:

zend_disk_cache_store();zend_disk_cache_fetch(); 

對於那些沒有Zend的,上面的相應的APC版本:

商店:

apc_store('cache_name',$any_variable,$expire_in_seconds); 

檢索:

$any_variable = apc_fetch('cache_name'); 

if ($any_variable === false) { 
    # cache was expired or did not exist. 
} 

從未使用過任何提及的其他方法。 如果您沒有可用的共享內存,則可以將數據序列化/反序列化到磁盤。當然,共享內存要快得多,大約Zend公司的好處是它處理併發性問題,爲您和允許命名空間:

商店:

file_put_contents('/tmp/some_filename',serialize($any_variable)); 

檢索:

$any_variable = unserialize(file_get_contents('/tmp/some_filename')); 

編輯:爲了處理併發問題,我認爲最簡單的方法是使用鎖定。我仍然可以在這個僞代碼之間看到競爭條件的可能性,這個僞代碼存在於鎖之間並且獲得鎖,但是您明白了。

的僞代碼:

while (lock exists) { 
    microsleep; 
} 
get lock. 
check we got lock. 
write value. 
release lock. 
+0

我沒有使用任何框架。我如何在不使用任何框架的情況下執行此操作 – cldy1020

+0

該框架是獨立於zend php堆棧實現的。我也沒有使用任何框架。 –

+0

對不起,我沒有Zend堆棧。如果使用共享內存或APC(如Alix Axel所述),併發問題如何處理 – cldy1020

1

您可以使用APCsimilars爲此,數據你把會出現在共享內存。

請記住,這當然不會在服務器重啓之間持續存在。

+0

謝謝,[APC](http://www.php.net/manual/en/book.apc.php)和[共享內存](http://www.php.net/manual)之間的主要區別是什麼/en/ref.shmop.php)? – cldy1020

相關問題