Подтвердить что ты не робот

Есть ли способ переносить тайм-аут на flock()?

flock() - это функция блокировки сообщений с помощью портативного. Они явно рекламируют, что он даже работает под окнами:

flock() позволяет вам выполнить простую модель чтения/записи, которая может использоваться практически на каждой платформе (включая большинство производных Unix и даже Windows).

Я хотел бы добавить также переносимый тайм-аут блокировки flock() (и ожидание ожидания не работает с опцией LOCK_NB). В UNIX это может быть достигнуто с установкой сигнала тревоги, который отправит SIGALRM:

pcntl_signal(SIGALRM, function() {});
pcntl_alarm(3);
try {
    if (!flock($handle, LOCK_EX)) {
        throw new \Exception("Timeout");
    }
} finally {
    pcntl_alarm(0);
    pcntl_signal_dispatch();
    pcntl_signal(SIGALRM, SIG_DFL);
}

Есть ли способ переносить таймаут на блокировку flock()? Если да, то как?

4b9b3361

Ответ 1

Я не думаю, что есть какой-либо способ сделать это в Windows без цикла ожидания ожидания/опроса.

PHP реализует flock в окнах, используя LockFileEx (см. flock_compat.c:132). Как вы можете видеть из этих похожих вопросов, нет способа установить тайм-аут на LockFileEx или отменить процесс, ожидающий запроса LockFileEx (т.е. Для этого прецедента нет эквивалента для сигнала SIGALRM):

Q) Если я хочу дождаться блокировки файлов с таймаутом, как бы я это сделал?

...

A) напишите небольшой цикл, чтобы проверить код возврата

  1. "LockFileEx не может отключить его просто зависает" из списка рассылки microsoft.public.win32.programmer.kernel, 1997

Q) Кто-нибудь знает, как получить LockFileEx в тайм-аут?

...

A) у вас может быть только немедленное сбой, сон и возврат назад пока вы не достигнете предела повторной попытки.