Таблица semaphore
Таблица semaphore является системной таблицей Drupal, которая реализует механизм семафоров для управления параллельным доступом к ресурсам. Она предотвращает конфликтные ситуации, когда несколько процессов (например, cron-задачи или одновременные запросы пользователей) пытаются получить доступ к одному и тому же ресурсу одновременно.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
name |
varchar(255) |
Уникальное имя семафора (блокировки). Идентифицирует ресурс, к которому ограничивается доступ. |
value |
varchar(255) |
Значение, ассоциированное с семафором. Обычно содержит идентификатор процесса, который владеет блокировкой. |
expire |
double |
Время истечения действия блокировки в формате Unix timestamp. По истечении этого времени блокировка автоматически снимается. |
Как это работает
Когда процессу необходимо получить эксклюзивный доступ к ресурсу, он пытается создать запись в таблице semaphore с уникальным именем семафора. Если запись с таким именем уже существует и время её действия (expire) еще не истекло, процесс ожидает освобождения блокировки или прекращает выполнение.
После успешного получения блокировки процесс выполняет необходимые операции с защищаемым ресурсом. По завершении работы процесс должен явно освободить блокировку, удалив соответствующую запись из таблицы.
Поле expire обеспечивает защиту от "зависших" блокировок. Если процесс завершился аварийно и не освободил блокировку, она автоматически станет доступной после истечения времени, указанного в этом поле.
Drupal Core использует механизм семафоров для различных системных задач, включая выполнение cron-заданий, пакетную обработку, кэширование и другие операции, требующие координации между параллельными процессами.
Пример SQL-запроса
Посмотреть активные блокировки можно следующим запросом:
SELECT name, value, FROM_UNIXTIME(expire) as expire_time
FROM semaphore
WHERE expire > UNIX_TIMESTAMP()
ORDER BY expire;