Бочонок
http://frontender.info
Общая память. Вопросы.
Приятного времени суток.
Пытаюсь разобраться с общей памятью и при этом использовать функции, которые работают как под *NIX так и под Windows.
Можно ли как то менять размер уже выделенного сегмента памяти?
Если нет - какой размер ему присваивать... Ведь объем данных меняется...
Если определять "с запасом" - в памяти блоки неоправданно большого размера будут. Это скверно.
- вопрос:
ftok никак не связан с адресацией реальной памяти...
Прекрасно заменился на:
$key = "0x".sha1($name);
Я не подумал о "0х"...
+ вопрос:
Что делать, если нельзя менять размер сегмента памяти созданного shmop_open(), после того, как он создан и при этом его нельзя удалить и создать новый, так как shmop_delete() не удаляет сегмент а помечает его "на удаление" и притом, только если скрипт запущен от имени пользователя создавшего сегмент или от имени рута. (правда это все равно пользователь апача... так что по идее всегда должно помечать).
Размер данных меняется... Как же быть?
С уважением, Боченок.
-~{}~ 04.05.08 16:55:
Посмотрел реализацию в пировской библиотеке работы с общей памятью
http://pear.php.net/package/System_SharedMemory
они создают один большой блок памяти и туда кидают сериализованый массив ассоциативнй со всеми переменными. И каждый раз его тягают.
При этом удаление из переменной - это удаление ее из массива.
Неужели это единственный способ?
фиксированый, избыточно большой блок памяти в который каждый раз записывается и каждый раз извлекается все его содежимое?
Если бы его хотя бы удалять можно было нормально... Это было бы решением проблемы...
Что то посоветуете?
Приятного времени суток.
Пытаюсь разобраться с общей памятью и при этом использовать функции, которые работают как под *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
они создают один большой блок памяти и туда кидают сериализованый массив ассоциативнй со всеми переменными. И каждый раз его тягают.
При этом удаление из переменной - это удаление ее из массива.
Неужели это единственный способ?
фиксированый, избыточно большой блок памяти в который каждый раз записывается и каждый раз извлекается все его содежимое?
Если бы его хотя бы удалять можно было нормально... Это было бы решением проблемы...
Что то посоветуете?