Общая память.int $key. Есть ли функции хеширования, для которых задается длина ключа?

Бочонок

http://frontender.info
Общая память. Вопросы.

Приятного времени суток.

Пытаюсь разобраться с общей памятью и при этом использовать функции, которые работают как под *NIX так и под Windows.
Можно ли как то менять размер уже выделенного сегмента памяти?
Если нет - какой размер ему присваивать... Ведь объем данных меняется...
Если определять "с запасом" - в памяти блоки неоправданно большого размера будут. Это скверно.

PHP:
class shared{
	function set($name,$value){
		$value=serialize($value);
		$key = "0x".sha1($name);
		$size = mb_strlen($value,'8bit');
		$id = shmop_open($key,'c',0666,$size);
		shmop_write($id,$value,0);
		shmop_close($id);
	}
	function get($name){
		$key = "0x".sha1($name);
		$id = shmop_open($key,'a',0,0);
		$value=shmop_read($id,0,shmop_size($id));
		shmop_close($id);
		return unserialize($value);
	}
	function remove($name){
		$key = "0x".sha1($name);
		$id = shmop_open($key,'w',0,0);
		$result = shmop_delete($id);
		shmop_close($id);
		return $result;
	}
}

- вопрос:
ftok никак не связан с адресацией реальной памяти...
Прекрасно заменился на:
$key = "0x".sha1($name);
Я не подумал о "0х"...

+ вопрос:
Что делать, если нельзя менять размер сегмента памяти созданного shmop_open(), после того, как он создан и при этом его нельзя удалить и создать новый, так как shmop_delete() не удаляет сегмент а помечает его "на удаление" и притом, только если скрипт запущен от имени пользователя создавшего сегмент или от имени рута. (правда это все равно пользователь апача... так что по идее всегда должно помечать).

Размер данных меняется... Как же быть?

С уважением, Боченок.

-~{}~ 04.05.08 16:55:

Посмотрел реализацию в пировской библиотеке работы с общей памятью
http://pear.php.net/package/System_SharedMemory
они создают один большой блок памяти и туда кидают сериализованый массив ассоциативнй со всеми переменными. И каждый раз его тягают.
При этом удаление из переменной - это удаление ее из массива.

Неужели это единственный способ?
фиксированый, избыточно большой блок памяти в который каждый раз записывается и каждый раз извлекается все его содежимое?

Если бы его хотя бы удалять можно было нормально... Это было бы решением проблемы...

Что то посоветуете?
 

WP

^_^
Сериализацию в топку однозначно.
Можно хранить карту сегментов и собирать значения из нескольких, т.е. получаем список сегментов переменной, и соединяем, а если при записи сегмент кончается, создаем еще один и добавляем в карту. Разумеется в разных задачах эффективны сегменты разного размера, это должно задаваться в настройке.
 

Бочонок

http://frontender.info
1. Почему сериализацию в топку? И как без нее хранить разнотипные объекты?

2. Карта сегментов? И как допустим можно это сделать. Тогда при записи информация сначала должна разбиться на куски, затем - мы создаем для каждого сегмент и записываем их. А при чтении все их считываем и собираем. Так мы получим выигрыш в занятой памяти. Но мы все равно должны в таком случае считать все, что записали и удаление происходит на логическом уровне (тоесть внутри сериализованного объекта(я пока не вижу как его можно заменить... Разве что написать свой вариант сериализации - но не вижу в этом смысла)) и при уменьшении даннных блоки все равно - в паяти.

Я правильно понял что предлагается? Если нет, то не могли бы вы объяснить подробнее?

-~{}~ 05.05.08 20:14:

Не подскажете?
 

WP

^_^
1. Я имею в виду в топку сериализацию в качестве хранилища переменных.
2. Неправильно, не надо будет из памяти читать всё, в отличие от варианта с сериализацией. Только то что нужно.
 

Бочонок

http://frontender.info
2WP:

1. Не понял вы предлагаете - вообще отказаться от сериализации переменных перед помещением их в память? Или от хранения всех элементов в сериализованом объекте? Если последнее - то в случае, когда мы используем карту большой объект не нужен... Вы правы.

2.
Я кажется понял. Тоесть сделать вариант на подобии файловой системы. Мы точно знаем где карта. Она задана как раз с избыточным обьемом и содержит информацию:
переменная:имена сегментов
Например:
class element{
public name;
public timeout;
public segment_array = array();
}


2kode:
Хочется использовать кроссплатформенные функции... что бы и пою юникс и под windows работало.
 
Сверху