События Laravel, запускаемые из разных HTTP-запросов, синхронизируются или асинхронны - PullRequest
0 голосов
/ 13 марта 2019

Два HTTP-запроса, полученные сервером с приложением PHP, использующим Laravel 5.2.Оба выпустили один и тот же тип события.Оба события перехвачены одним слушателем.

Q1: Будут ли события обрабатываться одно за другим в порядке, в котором они были получены Слушателем (синхронно), или будут обрабатываться одновременно?

Q2: Есть ли способ (или сделать это в другомспособ, если ответ Q1 является синхронизировать) синхронизировать любую функцию между запросамиЯ имею в виду, чтобы быть уверенным, что независимо от того, сколько запросов было получено одновременно, функция может быть выполнена только одним запросом за один раз

UPD.Вопрос, который я пытаюсь решить: мое приложение должно проходить аутентификацию в сервисе сторонних разработчиков.Очень важно установить только один сеанс, который будет использоваться другими частями приложения.Я хочу хранить токен доступа для сеанса в БД.Так что эта операция не является атомарной: 1. Попробуйте получить токен из БД2. Если токена не существует: 2A.Аутентифицируй и получай токен.2B.Храните токен в БД.3. Вернуть токен

1 Ответ

1 голос
/ 13 марта 2019

События не являются хорошим способом запуска функций в серии. Однако в PHP (а также в Javascript) обратные вызовы событий выполняются в том порядке, в котором их события были запущены (поэтому 1 -> 2 приводит к a -> b).

Вам нужно будет уточнить, почему вы хотите выполнять функцию только по одному запросу за раз. Скорее всего, вы ищете механизм блокировки или транзакции, который является функцией RDBMS / SQL, которая предотвращает редактирование записей, пока они еще не сохранены. Таким образом, когда 2 запроса одновременно достигают одной и той же функции PHP, вы можете попросить их подождать в базе данных, пока не завершится определенная транзакция, так что перекрытия при чтении или записи не могут иметь место.

См. https://laravel.com/docs/5.8/queries#pessimistic-locking и https://laravel.com/docs/5.8/database#database-transactions для реализации Laravel. На веб-сайте MySQL есть дополнительная информация (при условии использования InnoDB):

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...