19.7. Общая память ОС System V
PHP имеет расширение, предназначенное для работы с общей памятью ОС System V. Оно работает с учетом таких же ограничений, как и функции работы с семафорами ОС System V, т.е. ваша операционная система должна поддерживать такую возможность. С общей памятью могут работать только операционные системы Solaris, Linux и AIX.
Общая память - это память, которая используется несколькими отдельными процессами и позволяет процессам, работающим на одной и той же машине, обмениваться информацией. Совершенно естественным методом является запись информации в файл, но процесс доступа к постоянным устройствам памяти значительно медленнее. Общая память позволяет создавать системную память, доступ к которой могут получить сразу несколько процессов, что значительно быстрее. Так как обеспечение монопольного доступа к этой памяти является существенной проблемой, необходимо использовать определенный тип блокировки и обычно это реализуется с помощью семафоров. При использовании функций общей памяти необходимо также включить поддержку семафоров операционных систем System V.
Подробное описание механизма работы функций общей памяти выходит за рамки настоящей книги. Краткое описание этого механизма операционной системы можно найти на Web-узле whatis.com <http://www.whatis.com/>. Кроме того, курс по вычислительным системам в колледжах тоже предусматривает изучение этого механизма. Механизм использования общей памяти описан и в упоминавшейся уже книге Ричарда Стивенса Программирование сетей в Unix.
Расширение, работающее с общей памятью, было добавлено Кристианом Кэрту-сом (Christian Cartus).
integer shm_attach(integer key, integer size, integer permissions)
Функция shm_attach (листинг 19.21) возвращает в общую память идентификатор. Аргумент key задает целое число, определяющее общую память. Общая память создается по мере необходимости, и в этом случае могут использоваться необязательные аргументы size и permissions. По умолчанию размер сегмента памяти определяется при компиляции PHP. Минимальный и максимальный размер зависят от операционной системы, но приемлемыми являются и минимальный объем, составляющий 1 байт, и максимальный - 128 Кбайт. Существует еще ограничение на количество сегментов общей памяти. Обычным ограничением является 1000 сегментов, или 6 сегментов на процесс.
Значение аргумента permissions для сегмента памяти по умолчанию равно 0666, что равносильно разрешению на запись и чтение для всех пользователей. Это значение работает аналогично разрешению на доступ к файлам.
Как и при работе с семафорами, вызов функции shm_attach дважды для одного и того же ключа даст два разных идентификатора, которые будут указывать на один и тот же сегмент. 
Следует помнить, что общая память не освобождается автоматически. Для этого необходимо вызвать функцию shm_remove.
Разное:Apache,IMAP,MnoGoSearch,OpenSSL
boolean* shm_detach(integer identifier)
Функция shm_detach предназначена для освобождения памяти, связанной с идентификатором сегмента общей памяти. При этом общая память сама по себе не освобождается - для этого предназначена функция shm_remove.
value shm_get_var(integer identifier, integer key)
Функция shm_get_var возвращает значение, сохраненное в переменной с помощью функции shm_put_var.
boolean shm_put_var(integer identifier, integer key, value)
Функция shm_put_var задает значение для переменной в сегменте общей памяти. Если эта переменная не существует, она будет создана. Созданная переменная будет присутствовать в общей памяти до тех пор, пока не будет удалена с помощью функции shm_remove_var или пока сегмент общей памяти не будет удален с помощью функции shm_remove. Аргумент value будет трансформирован аналогично аргументу функции serialize. Это значит, что можно использовать любое значение или переменную PHP, правда, с одним исключением: при записи объекты трансформации теряют свои методы.
boolean shm_remove(integer identifier)
Функция shm_remove (листинг 19.22) предназначена для освобождения сегмента памяти. При этом все переменные, хранящиеся в данном сегменте, будут удалены. Поэтому специально удалять их не следует. Если сегменты общей памяти специально не удалить с помощью этой функции, они будут существовать всегда.

Листинг 19.22. Функция shm_remove
<?php /*
** Пример использования общей памяти № 2 **
** В этом примере будет удалена общая память,
** созданная в предыдущем примере.
*/
//Задать целое число в качестве ключа семафора define("SEM_COREPHP", 1970);
// Задать целое число в качестве ключа общей памяти define("SHM_COREPHP", 1970);
// Задать целое число в качестве переменного ключа define("SHMVAR_MESSAGE", 1970); // Принять или создать семафор
//Этот семафор может быть запрошен только один раз
$sem = sem_get(SEM_COREPHP, 1);
// Запросить семафор
if(sem_acquire($sem))
{
//присоединить к общей памяти //задать размер памяти равным 1K $mem = shm_attach(SHM_COREPHP, 1024); //удалить переменную 
shm_remove_var($mem, SHMVAR_MESSAGE); //удалить общую память shm_remove($mem); //освободить семафор sem_release($sem);
}
else
{
//запрос семафора был неудачным
print("Запрос семафора был неудачным!<br>n");
}

boolean shm_remove_var(integer identifier, integer key)
Функция shm_remove_var освобождает память, связанную с переменной, находящейся в сегменте общей памяти.