На наших веб-серверах происходили случайные сбои PHP-запросов для некоторых запросов, связанных с семафорами. Мы отследили и предположили, что запрос где-то умер из-за функций sem _ * () в PHP, но мы не смогли найти что-то полезное из журнала ошибок. Мы находимся на PHP 5.3.6 на 64-битных машинах Linux. Код работает так:
$sem_id = @sem_get(123457, 1);
if (!$sem_id) return;
$sem_retval = @sem_acquire($sem_id);
if (!$sem_retval) return;
$shm_id = shmop_open(ftok('/some/path', 'h'), 'c', 0666, 8192);
if ($shm_id === FALSE) { @sem_release($sem_id); return; }
$str = shmop_read($shm_id, 0, 8192);
// ... some operations that may result in changes to $data
if ($data_updated) {
shmop_write($shm_id, str_pad(serialize($data), 8192, "\0"), 0);
}
@shmop_close($shm_id);
@sem_release($sem_id);
@sem_remove($sem_id);
Этот фрагмент находится в области с очень частым доступом с одновременным доступом. Фактически это заложено в реализацию StreamWrapper, которую мы разработали для поддержки наших собственных операций. Похоже, что параллелизм связан, потому что мы тестировали последовательно и не выявили никаких проблем.
Есть ли какие-либо идеи о том, что может быть причиной? Кроме того, я не уверен, что делает sem_remove (), поскольку я не нашел аналога системного вызова.
P.S. Мы удалили все операторы, содержащие sem _ * (), и, похоже, проблема больше не возникает.