2012-05-30 2 views
5

Я пытаюсь реализовать hashmap (ассоциативный массив в PHP) в PHP, который доступен для широкого применения, и хранить его в контексте приложения, он не должен быть потерян, когда программа закончится. Как я могу это сделать на PHP?hashmap в контексте приложения php

Спасибо,

+1

PHP сам по себе не имеет никакого 'контекста приложения'. Есть обходные пути (а именно хранение вещей в файлах или разделяемой памяти), но в остальном ничего не сохранится в конце выполнения скрипта PHP. – zneak

ответ

1

Если вы используете версию php Zend, это легко.
Вам не нужно сериализовать данные.
Только содержимое может быть кэшировано. Ресурсы, такие как дескрипторы файлов, не могут. Чтобы сохранить 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(); 

Для тех, кто не Зенд, соответствующие версии АРС вышеперечисленного:

Магазин:

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. 
} 

Никогда не использовал ни одного из других упомянутых методов. Если у вас нет доступной для вас общей памяти, вы можете сериализовать/unserialize данные на диск. Конечно, разделяемая память намного быстрее, и хорошая вещь о Зенд это он обрабатывает проблемы параллелизма для вас и позволяет пространство имен:

Магазин:

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

Получить:

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

Edit: Для того, чтобы справиться с проблемы параллелизма, я думаю, что самый простой способ - использовать блокировку. Я все еще вижу возможность условия гонки в этом коде psuedo между блокировкой и блокировкой, но вы понимаете смысл.

код псевдопользователей:

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

Вы можете использовать APC или similars для этого, данные, которые вы положили будет доступна в общей памяти.

Уточните, что это не будет продолжаться между перезапусками сервера, конечно.

+0

Спасибо, Каковы основные различия между [APC] (http://www.php.net/manual/en/book.apc.php) и [общая память] (http://www.php.net/manual /en/ref.shmop.php)? – cldy1020

Смежные вопросы