Странное поведение ф-й работы с общей памятью. (shmop,shm)

Бочонок

http://frontender.info
Странное поведение ф-й работы с общей памятью. (shmop,shm)

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

Столкнулся с тем печальным фактом что ни apc ни memcash на виртуальном хостинге выклянчить у провайдера проблематично.
Написал класс для работы с общей памятью...
И вот выложив все на хостинг обнаружил что ничего не работает хотя на тестовом хосте все было нормально.
Написал тестовые скрипты (приведены в конце поста).
В результате само обращение к общей памяти работает. Но вот при повторном вызове того же скрипта мы все равно не видим сегмента памяти созданного при первом вызове и данных в нем.
У меня складывается такое подозрение, что общая память уникальна для каждого запуска скрипта. Что в принципе - бред. Про что я забыл? Где промахнулся? Подскажите пожалуйста.

Хостинг mirohost.net
http://amarillis.com.ua/shm.php
PHP:
<?php
$id = shm_attach("sha1('кэш')");
echo "<br/>".shm_get_var($id,sha1('значение1'));

if(!shm_put_var($id,sha1('значение1'),'значение 1')){
	echo '<br/>переменная не записана';	
}
echo "<br/>".shm_get_var($id,sha1('значение1'));
shm_detach($id);
?>
http://amarillis.com.ua/shmop.php
PHP:
<?php
$size=shmop_open(0,'c',0777,PHP_INT_SIZE);
$id=shmop_open(1,'c',0777,2097152);
$var_size = (int)shmop_read($size,0,PHP_INT_SIZE);
if($var_size==0){
	echo "<br/>no var found";
}else{
	$var_value = shmop_read($id,0,$var_size);
	echo "<br/>".$var_value;
}
$value='нечто';
shmop_write($id,$value,0);
shmop_write($size,(int)strlen($value),0);

$var_size = (int)shmop_read($size,0,PHP_INT_SIZE);
if($var_size==0){
	echo "<br/>no var found";
}else{
	$var_value = shmop_read($id,0,$var_size);
	echo "<br/>".$var_value;
}
?>
-~{}~ 09.09.08 14:08:

Кто нибудь? Подскажите...
 

voodoo

Новичок
помнится были модули какие-то где-то, которые очищали блок shared memory если его никто не использует (т.е. никто из процессов не "приконнекчен").

с утра таки нагуглил: http://faq.altlinux.ru/index.php?action=listq&nf=1&qid=644

доступ к шеллу есть? можно по ipcs поглядеть, живут ли блоки или нет.
 

Бочонок

http://frontender.info
Нет. Это виртуальный хостинг. Только панель управления и .htaccess к сожалению

-~{}~ 10.09.08 14:51:

Отписался хостерам - посмотрим что ответят.

-~{}~ 10.09.08 14:52:

2voodoo:
И спасибо тебе огромное.

-~{}~ 10.09.08 17:18:

Все оказалось очень прозаично.
Очень-очень.
Идентификатор сегмента памяти должен быть не просто int, как написано в мане. Он должен быть больше 0. :)
В процессе был написан небольшой сервер для поддержки сегментов в открытом состоянии. Выкладываю просто так. Поржать.

start_cache_server.php
PHP:
<?php
ignore_user_abort(true);
ini_set("max_execution_time",0);
	
$time_limit_key=false;
if((int)ini_get("max_execution_time")>0){
	if(function_exists('set_time_limit')) {
		$time_limit_key=true;
	}else{
		die("Сервер не может быть запущен, так как нет способа превысить ограниченное время выполнения скрипта. На данный момент это время равно: ".ini_get("max_execution_time"));
	}
}

$server=shmop_open(crc32('Сервер кэша.'),'c',0777,PHP_INT_SIZE);
$size=shmop_open(crc32('Текущий размер содержимого кэша.'),'c',0777,PHP_INT_SIZE);
$id=shmop_open(crc32('Кэш.'),'c',0777,2097152);

shmop_write($server,1,0);

while(true){
	if((int)shmop_read($server,0,PHP_INT_SIZE)==0){
		break;
	}
	if($time_limit_key===true){
		set_time_limit(15);
	}
	sleep(10);
}

shmop_close($server);
shmop_close($size);
shmop_close($id);
?>

view_cache_server.php
PHP:
<?php
$server=shmop_open(crc32('Сервер кэша.'),'c',0777,PHP_INT_SIZE);
echo (int)shmop_read($server,0,PHP_INT_SIZE);
shmop_close($server);
?>
stop_cache_server.php
PHP:
<?php
$server=shmop_open(crc32('Сервер кэша.'),'c',0777,PHP_INT_SIZE);
shmop_write($server,0,0);
shmop_close($server);
?>
 
Сверху