Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > shmop_open


Автор: RinatR 30.11.2010, 00:11
Здраствуйте!
В php вроде как есть возможность загружать необходимую инфу в оперативную память. Вроде все понятно, но справки и примеров как кот налакал. 

Есть что-то вроде такого (из примера на php.net)

Код

// Create 100 byte shared memory block with system id if 0xff3
$shm_id = shmop_open(0xff3, "c", 0644, 100);
if (!$shm_id) {
    echo "Couldn't create shared memory segment\n";
}


Вопрос про первый параметр (0xff3). Как я понимю, здесь должно быть какое-либо уникальное значение? Это что-то вроде ключа Так? Или оно откуда-то берется?
Если да, то как мне возможно мою строку (например строка - это название файла item.htm) превратить в такой вот вид?

Автор: gta4kv 30.11.2010, 12:51
http://ru.php.net/shmop_open

Автор: RinatR 30.11.2010, 13:15
Было бы глупо, если бы я там не смотрел. 
Больше интересует вторая часть вопроса. Как возможно превратить строку в такой параметр, чтобы он был уникальным? 
Там предлагается делать ftok'ом, но этот вариант не подойдет ибо:

1) У меня винда, на которой этот товарищ не работает
2) ftok, как я понимаю обращается к файлу, и получает что-то из него. Тогда смысл теряется, ибо это совсем будет не быстро.

Автор: gta4kv 30.11.2010, 13:27
Код

function ftok($pathname, $proj_id) {
    $st = @stat($pathname);
    if (!$st) {
        return -1;
    }
   
    $key = sprintf("%u", (($st['ino'] & 0xffff) | (($st['dev'] & 0xff) << 16) | (($proj_id & 0xff) << 24)));
    return $key;
}

Автор: RinatR 30.11.2010, 13:36
Функция stat подразумевает оборащение к файлу. 
Код

 $st = @stat($pathname);



Вот мой пример (кеширование файлов в оперативной памяти)

Код


function shmop_get_contents($filename)
{
    
    
    $key =  ftok($filename, 't');          
  
   $id = shmop_open($key, "a", 0644, 2000);
   
   if ($id === FALSE)
   {
         $content = file_get_contents($filename);       
         $id = shmop_open($key, "c", 0644, 2000);
         shmop_write($id, $content, 0);
         $return = shmop_read($id, 0, 2000);       
   }
   else
   {
     $return =  shmop_read($id, 0, 2000);     
       
   }


Если ftok будет обращатся к этим файлам из свойств файла гененрировать ключи только для того, чтобы потом прочесть все это дело из оперативной памяти... то смысла нету.

Автор: ksnk 30.11.2010, 13:47
RinatR, функция stat лезет не в файл, а в запись о файле в файловой системе, что существено быстрее, так как в обычных системах эта информация и так в памяти.

Автор: gta4kv 30.11.2010, 14:00
Поставьте memcahced smile

Автор: RinatR 30.11.2010, 14:01
Чего-то я не уверен, что вышеописаный способ гененрирует уникальные ключи.
После старта вот такая ерунда:


Код


---------------------------
httpd.exe - Ошибка приложения
---------------------------
Инструкция по адресу "0x00a06e4c" обратилась к памяти по адресу "0x80000017". Память не может быть "written".


"ОК" -- завершение приложения
"Отмена" -- отладка приложения
---------------------------
ОК   Отмена   
---------------------------


Вот чё получается:
Код

251638400
251638400
251638400
251638400
251638400
251638400
251638400
251638400
251638400


если присмотрется внимательно, то можно увидеть следующую тенденцию:

Код

        
        echo $pathname;
        echo '<br>';
        echo $st['ino'];
        echo '<br>';
        echo $st['dev'];
        echo '<br>';


Код

путь/includes/functions/all.php
0
25
1638400
путь/config/config_debug.php
0
25
1638400
путь/config/config_db.php
0
25
1638400
путь/modules/files/switch.php
0
25
1638400


gta4kv: 
- Здраствуйте, скажите пожалуйста, у этой булочки помимо орехов, что внутри?
- Возьмите лучше торт!

Тоже самое получается... короче игрался я и с memcached, пока совсем не впечатлил.



Автор: gta4kv 30.11.2010, 14:49
Цитата

Тоже самое получается... короче игрался я и с memcached, пока совсем не впечатлил.

Значит, вы не умеете его готовить. smile Facebook, например, впечатляет мэмкэшед.

Давайте пойдем по другому - в чём задача вообще? На самом ли деле нужно использование оперативной памяти для этой цели...

Автор: RinatR 30.11.2010, 15:00
Да, нужно. Тот же file_get_contens работает на порядок дольше. 

Не хотелось уводить тему в другое русло, таки но офтоп: 
C memcache можеть что-то и не так сделал, но этот вопрос я задам в другой теме все же.

Сейчас, я просто пробую различные способы кеширования (будь то memcache, shmop, APC и др.). Хотел сравнить. Пока shmop быстрее работает. 

Автор: gta4kv 30.11.2010, 15:02
Цитата(gta4kv @ 30.11.2010,  14:49)
в чём задача вообще?

^^^

Автор: RinatR 30.11.2010, 15:12
Задача: Кеширование php файлов в оперативной памяти и последующий доступ к ним. 

Автор: gta4kv 30.11.2010, 16:05
Зачем?

Автор: RinatR 30.11.2010, 22:18
Чего работает быстрее? К жесткий диск или к оперативная память?

Автор: gta4kv 30.11.2010, 22:48
Ответ очевиден. Но, я сомневаюсь, в том масштабе, при котором это начинает быть заметным.

Автор: RinatR 2.12.2010, 20:33
А я нет. 
Короче ля ля ля ля, а толку 0  smile 

Вот хороший пример, от Yoshi генерации более менее уникального ключа, за что ему огромный респект.
Код

function ftok($pathname, $proj_id) {
  if (stat($pathname)) {
   return sprintf("%u", (crc32 ($pathname) & 0x00ffffff) | (($proj_id & 0xff) << 24 ));
  }
  return -1;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)