@V0VA

Как в php заблокировать файл от других обращений?

Добрый день! Есть файл, который принимает POST от 1С и обновляет данные в базе данных.
Вопрос как сделать так, чтобы пока он не выполнил задание от текущего обращения блокировал его повторное выполнение другим следующим запросом. Подскажите, пожалуйста, кто знает, где копать ?
  • Вопрос задан
  • 100 просмотров
Решения вопроса 3
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Запускается скрипт -> из него проверяется файл-семафор -> если семафор есть - завершаем скрипт (с ошибкой?) -> если семафора нет - создаём и делаем остальные дела.

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

А можно... да тут 100500 вариантов можно придумать!
Ответ написан
@rPman
POST это http?
Тебе нужен свой http сервер, реализующий нужную логику. Инструментов миллион, попробуй swoole
.
Если его реализовать без многопоточности и асинхоронщины, то пока он будет обрабатывать один запрос, никакой другой не будет получен, другие будут ждать в очереди сетевого стека и отваливаться с ошибкой по таймауту.

Интересно что встроенный отладочный http сервер php -S xxx:port какраз однопоточный, и хотя его не рекомендуют для продакшн, можешь попробовать.
Ответ написан
@pantsarny
Блокировал это как? Чтобы ждали или получали ошибку?

Создавай эксклюзивную блокировку файла
И проверяй ее наличие

Или открывай сокет, это тоже эксклюзив

Ну или старый добрый семафор
if ($theSemaphore = sem_get("123456",1)) { // this "1" ensures that there is nothing parallel
if (sem_acquire($theSemaphore)) { // this blocks the execution until other processes or threads are finished

sem_release($theSemaphore); // This should be called only if sem_acquire() succeeds
}
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы