Разделяемая память
Управляющие функции
🕛 01.11.2006, 13:43
Данный набор функций позволяет РНР создавать, удалять, читать и записывать данные в разделяемые блоки памяти UNIX. С помощью разделяемой памяти можно осуществлять глобальный обмен данными между приложениями. В системах Windows эти функции не работают, так как там не поддерживается разделяемая память1. Для использования этих функций необходимо скомпилировать РНР с параметром - enable-shmop. В версиях РПР 4.0.3 и ниже эти функции имели префикс shm_. <?php
' Sshmjd = shmop_open
(0xff3. "с". 0644. 100) if('$shmjd
) { echo "Couldn't create shared
memory segment\n": }
$shm_size = bhmop_size($shmjd):
echo "Был создан SHM Block
размером: ",$shm_size. "\n".
$shm_bytes_wntten = shmop_write
($shffl_i(J. "my shared memory block", 0);
if($shm_bytes_wntten =
strlenC'my shared memory block"))
{ echo "Невозможно записать
все данные\n". } $my_stnng =
shmop_read($shmjid. 0. $shm_size):
if(!$my_stnng) { echo "Невозможно
прочитать даннь:е\n". }
echo "Данные в блоке: ".
$my_stnng. "\n":
if(!shmop_delete(Ishm_1d))
{ echo "Невозможно
удалить блок памяти". }
shmop_close($shin_id): ?>
shmop_open
Создание или открытие блока разделяемой памяти
int shmop_open (int key, string flags, int mode, int size)
В аргументе key указывается системный идентификатор блока; во втором аргументе, flags, указывается вид операции:
"а" - открыть доступ к уже существующему блоку (IPC_EXCL);
"с" - создать новый блок (IPC_CREATE).
Если блок создастся, то в третьем и четвертом аргументах передаются соответственно: права доступа к нему (обычно в восьмеричном представлении) и размер в байтах. Если же блок открывается, то в третьем и четвертом аргументах следует передавать значение 0.
В случае успеха функция возвращает дескриптор блока, используе- | мый в последующих операциях с ним.
shmop_size
Получение размера блока разделяемой памяти
int shmop_size (int shmid)
Возвращает размер блока, указанного дескриптором shmid.
shmop_read
Чтение данных из блока разделяемой памяти
string shmop_read (int shmid, int start, nnt count)
Возвращает прочитанную строку данных размером count байтов, начиная со смещения start, из блока, указанного дескриптором shmid.
shmop_write
Запись данных в блок разделяемой памяти
int shmop_write (int shmid, string data, int offset)
Записывает строку данных data в блок, указанный дескриптором shmid, по относительному адресу (смещению от начала блока) offset.
shmop_delete
Удаление блока разделяемой памяти
int shmop_delete (int shmid)
В аргументе shmid указывается дескриптор блока.
В случае успеха возвращает 1, а при ошибке - 0.
shmop_close
Закрытие блока разделяемой памяти
int shmop_close (int shmid)
В аргументе shrald указывается дескриптор блока.
Семафоры
Данная группа функций позволяет использовать семафоры и разделяемую память (System V). Семафоры могут использоваться для реализации доступа к системным ресурсам в эксклюзивном режиме (или ограничивать число процессов, одновременно использующих один ресурс). Сами по себе семафоры не защищают от одновременного использования ресурса, а используются для синхронизации.
Операционные системы Unix имеют следующие ограничения:
SHMMAX - максимальный размер блока разделяемой памяти, обычно 131 072 байта;
SHMMIN - минимальный размер блока разделяемой памяти, обычно 1 байт;
SHMMNI - максимальное число блоков разделяемой памяти в системе, обычно 100;
SHMSEG - максимальное число блоков разделяемой памяти для одного процесса, обычно 6.
Эти функции не работают в Windows.
sem_get
Получение дескриптора семафора
int sem_get (int key [, int max_acquire [, int perm]])
Возвращает дескриптор семафора с идентификатором key или FALSE - при ошибке.
При отсутствии такого семафора он создается, и в аргументах тах_ acquire и perm можно задать: число процессов, которые могут заблокировать этот семафор (по умолчанию 1 - «никакой процесс, кроме данного»), и нрава доступа к нему (по умолчанию 0666).
См. также: sem_acquire() и sem_release().
sem_acquire
Блокировка семафора
int sem_acquire (int senMdentifier)
Возвращает TRUE или FALSE - при ошибке. Число процессов, которые одновременно могут заблокировать семафор, указывается при его создании (аргументом max_acquire), и если оно уже достигнуто, попытки блокировки отвергаются. После завершения процесса, если он не освобождает семафор, выдается предупреждение.
См. также: sera_get() и sem_release().
sem_release
Освобождение семафора
int sem_release (int sem_identifier)
Освобождает семафор, заблокированный ранее данным процессом. Возвращает TRUE или FALSE - при ошибке (с выдачей предупреждения). После освобождения семафора его снова можно заблокировать функцией sem_acqihre().
См. также: sera get() и sero_acquire().
shm_attach
Создание или открытие блока разделяемой памяти
int shm_attach (int key [, int memsize [, int perm]])
В аргументе key указывается системный идентификатор блока. В случае успеха функция возвращает дескриптор блока разделяемой памяти System V, используемый в последующих операциях с ним. Если такого блока не существует, то он создается, и тогда в аргументе memsize можно указать его размер в байтах. (Если значение не указывается, то создается блок размером 10 000 байт, размер по умолча-' нию можно также задать, добавив в файл конфигурации параметр sysvshm.initjnem=.) В аргументе perm можно указать права доступа (по умолчанию 0666).
Повторный вызов функции с тем же значением key создаст новый дескриптор на тот же блок (аргументы memsize и perm будут игнорироваться).
shm_detach
Закрытие блока разделяемой памяти
int shm_detach (int shm_identifier)
Данные блока shmjdentifier при закрытии сохраняются.
shm_remove
Удаление блока разделяемой памяти
int shm_remove (int shmjiclentifier)
Все данные блока shm_identifier уничтожаются.
shm_put_var
Добавление или обновление переменной в разделяемой памяти
int shm_put_var (int shm_identifier, int variable_key, mixed variable)
Присваивает значение PHP-переменной variable переменной в блоке разделяемой памяти (с дескриптором shm_identifier), имеющей идентификатор variable_key. Поддерживаются все типы переменных (double, int, string, array).
shm_get_var
Получение переменной из разделяемой памяти
mixed shm_get_var (int id, int variable_key)
Возвращает значение переменной variable_key.
shm_remove_var
Удаление переменной из разделяемой памяти int shm_remove_var (int id, int variable_key) Удаляет переменную variable_key и освобождает память.