php запросы по одному или одновременно - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть несколько вопросов о php и о том, как запросы работают под капотом.Я перечислю все свои вопросы здесь и буду рад получить помощь, если бы вы могли просто ответить на них.

1) Допустим, я написал свое php-приложение и загрузил его на сервер.теперь есть функция, которую я написал, и если пользователь идет по тому маршруту, который выполняет эту функцию, что-то происходит.Вопрос: если один пользователь делает запрос, а другой пользователь также делает запрос, должен ли второй пользователь ждать, пока не будет выполнен запрос первого пользователя?(говоря, что запрос выполнен, я имею в виду, пока написанная мной функция не будет выполнена до конца).Это правильное предположение или не имеет значения, какая функция выполняется.пока запрос не выполнен, второй запрос никогда не запускается?Было бы хорошо, если бы вы могли дать мне какое-то объяснение.

2) У меня есть php-приложение.Представьте, что два человека делают запрос одновременно, который записывает данные в базу данных (не записывает, а обновляет).скажем, я использовал балансировщики нагрузки.если один пользователь отправляет запрос на балансировщик1, а другой пользователь отправляет запрос на балансировщик2, я хочу сделать, если вызов первого пользователя обновляет базу данных, запрос второго пользователя должен немедленно прекратиться (он не должен обновляться).Сценарий заключается в том, что в моей базе данных есть токен jwt, который используется для выполнения запросов на сторонних инструментах.срок действия 1 час.скажем, 1 час прошел.если один пользователь выполняет вызов для обновления токена, а второй пользователь также выполняет вызов для обновления токена, то произойдет, если второй пользователь обновит токен, и токен первого пользователя будет недействительным.что плохоЯ надеюсь, что вы можете понять.Я лучше объясню, если вы спросите.

Спасибо.это действительно важно для меня (оба вопроса).

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019
  1. Если у вас есть маршрут, который обслуживается функцией контроллера, для каждого запроса существует отдельная реализация контроллера.Например: пользователь A и пользователь B запрашивают один и тот же маршрут laravel.com/stackoverflow, контроллер готов ответить на каждый запрос, независимо от того, сколько пользователей запрашивают одновременно.Подобное можно рассматривать как принцип процессов для любого сервиса.Например, Laravel у нас работает на PHP.Так что php создает потоки процессов каждый раз, когда нам нужен PHP для обработки любого скрипта.Аналогичным образом Laravel создает экземпляр контроллера для каждого запроса.
  2. Для одного и того же пользователя, отправляющего несколько запросов, он будет по-прежнему обрабатываться, как в пункте 1.
  3. Если вы хотите обрабатывать отдельные запросы один за другим, вы можете очередь рабочих мест.Например, допустим, вы хотите обработать платеж.У вас 5 запросов происходит.Таким образом, контроллер будет принимать все запросы одновременно, но функция контроллера может отправлять задание в очереди, и они обрабатываются один за другим.
  4. Учитывая, что два человека пытаются запросить один и тот же маршрут, который имеет функцию обновления БД, вы можете прочитатьхорошая статья здесь об оптимистической и пессимистической блокировке.
0 голосов
/ 15 февраля 2019

Я должен проголосовать, чтобы закрыть это - он слишком широк ... но я попробую.

Если запросы зависят от ресурса, который может выполнять только одну задачу за разто они не могут «бежать» одновременно.Вполне возможно, что у вас может быть одно ядро ​​ЦП или один диск - однако на уровне HTTP-запроса (при отсутствии кода для применения блокировки мьютекса) они будут работать одновременно - это то, что-задача это все о.Поток выполнения часто задерживается в ожидании чего-то еще, и в этот момент планировщик задач ОС проверит, есть ли другие задачи, ожидающие запуска.Вы можете легко проверить это самостоятельно:

 <?php

 $started=time();
 sleep(20);
 print "Ran for " . (time() - $started) " seconds";

(попробуйте получить доступ к этому в разных окнах браузера одновременно - или в 2 фреймах в одном окне)

Сравните это с:

 <?php

 $started=time();
 $fh=fopen("/tmp/concurency_test", "w");
 flock($fh, LOCK_EX);
 sleep(20);
 flock($fh, LOCK_UN);
 print "Ran for " . (time() - $started) " seconds";

Это также демонстрирует лишь одну из причин, по которой вам не следует использовать плоские файлы для хранения данных на вашем сервере.Обратите внимание, что обработчик сеанса по умолчанию в PHP использует блокировку на основе файлов на время, когда данные сеанса открываются сценарием.

В базах данных используется множество стратегий, позволяющих избежать возврата в очередь из одной операции - чаще всего это управление версиями.Это не решает проблему, которую вы описываете: 2 клиента никогда не должны использовать один и тот же токен сеанса, поэтому токен сеанса отделен от учетных данных в хорошо спроектированной системе.

0 голосов
/ 15 февраля 2019

PHP будет обрабатывать запросы одновременно.Работа над одним запросом не заблокирует другой для разных пользователей.Но PHP может выполнять запросы от одного и того же пользователя по одному, если сеанс PHP заблокирован первым запросом.Второй запрос будет обработан, когда сессия будет закрыта.

Попробуйте запустить скрипт PHP с sleep(30) на первой вкладке браузера:

<?
session_start();

sleep(30);

И еще один скрипт на другой вкладке браузера:

<?
session_start();

echo 'hello';

Сценарий # 2не будет выполняться, пока не будет выполнено первое.

Это важно, потому что вы используете сеансы в каждом приложении.

...