Глава 30. PHP: Функции семафоров и разделяемой памяти
Семафоры («сигнальные функции») — специальные функции, которые применяются для обеспечения эксклюзивного доступа к ресурсам машины или для ограничения числа процессов, которые могут одновременно использовать ресурс. В РНР используются семафоры на основе System V. Поддержка разделяемой памяти также включена. Она может быть использована для обеспечения доступа к глобальным переменным.
ВНИМАНИЕ
Разделяемая память не может осуществить запоминание при одновременном доступе нескольких процессов.
Sem_get
Получение идентификатора семафора. Синтаксис:
int sem_get(int key, int [ max_acquire ], int [ perm ]);
Возвращает положительный идентификатор семафора при успехе или false при ошибке.
Sem_get() возвращает идентификатор, который может быть использован для доступа к семафору System V c указанным ключом. Семафор создается, если необходимо, используя биты доступа, указанные в perm (по умолчанию 0666). Число процессов, которое может быть зафиксировано семафором одновременно, устанавливается в max_acquire (по умолчанию 1). В действительности это значение устанавливается, только если процесс обнаруживает, что он единственный, присоединенный к семафору.
Повторный вызов функции sem_get() с тем же ключом вернет другой идентификатор семафора, но оба идентификатора указывают на один и тот же семафор.
Sem_acquire
Фиксирует семафор. Синтаксис:
int sem_acquire(int sem_identifier);
Возвращает true при успехе, false при ошибке.
Sem_acquire() блокируется (если необходимо) до тех пор, пока семафор сможет быть зафиксирован. Процесс, пытающийся зафиксировать семафор, который уже зафиксирован, будет блокирован навсегда, если фиксация семафора вызовет превышение его значения sem_identifier.
После обработки запроса, любые семафоры, зафиксированные процессом, но не освобожденные вручную, будут освобождены автоматически с выдачей предупреждения.
Sem_release
Освобождает семафор. Синтаксис:
int sem_release (int sem_identifier);
Возвращает true при успехе и false при ошибке.
sem_release () освобождает семафор, если он зафиксирован в данное время вызывающим процессом, иначе выдается
После освобождения семафора функция sem_acquire() может быть вызвана для его рефиксации.
Shm_attach
Создает или открывает разделяемую память. Синтаксис:
int shm_attach(long key, long memsize, long pern);
Создает или открывает разделяемую память с указанным ключом и размером памяти.
Shm_detach
Отсоединяет от разделяемой памяти. Синтаксис:
Отсоединяет от разделяемой памяти с указанным ID, созданным с помощью функции Помните, что разделяемая память все еще существует в Unix-системе и данные все еще присутствуют.
Shm_put_var
Вставляет или обновляет переменную в разделяемой памяти. Синтаксис:
int shm_put_var (int id, long variable_key, mixed variable);
Вставляет или обновляет переменную с указанным variable_key. Все типы переменных (double, long, string, array) поддерживаются. Функция serialize() может быть использована для хранения данных.
Shm_get_var
Считывает переменную с указанным variable_key. Синтаксис:
mixed shm_get_var(int id, long variable_key);
Считывает переменную с указанным variable_key. Переменная все еще присутствует в разделяемой памяти. Функция unserialize() может быть использована для декодирования данных.
Shm_remove_var
Удаляет переменную из разделяемой памяти. Синтаксис:
int shm_remove_var(int id, long variable_key);
Удаляет переменную с указанным из разделяемой
Shm_remove
Удаляет разделяемую память. Синтаксис:
int shm_remove (long key);
Удаляет разделяемую память из Unix-системы. Все данные будут уничтожены.