Что если несколько пользователей одновременно обратятся к скрипту?

Имеется следующая связка:

apache - php - mysql
или
nginx - php - mysql

Собственно вопросы: Что происходит когда

1) разные пользователи одновременно обращаются к разным php-скриптам на nginx или apache сервере?
2) а если одновременно и к одному скрипту?
3) несколько пользователей по средством скрипта одновременно запросили данные из БД (MySQL), например, для рендера динамической страницы (и если эта самая страница не закеширована не сервере)?
4) нужно одновременно записать в одну таблицу (MySQL) данные от нескольких пользователей? Например, они одновременно отправили комментарий?

Интересно именно в контексте apache/nginx - php - mysql.
Как происходит обработка одновременных запросов от разных пользователей в логике описанных серверов, в логике php и mysql? Ставятся ли запросы в очередь, выполняются ли параллельно или может происходят какие-то ошибки?
И в какую сторону копать, чтобы разобраться в этом? Заранее спасибо.
  • Вопрос задан
  • 3800 просмотров
Решения вопроса 1
saboteur_kiev
@saboteur_kiev
software engineer
1) разные пользователи одновременно обращаются к разным php-скриптам на nginx или apache сервере?

Не очень понятен вопрос. Каким образом разные пользователи обращаются к разным php скриптам ?
Пользователи обращаются к веб серверу (apache/nginx), и к скриптам (с точки зрения скрипта) обращается только один пользователь, от имени которого запущен собственно apache/nginx.
Как работает многозадачность в apache/nginx можно читать спецификации. Но парралельная обработка одного и того же скрипта не проблема.

2) а если одновременно и к одному скрипту?

Тоже самое

3) несколько пользователей по средством скрипта одновременно запросили данные из БД (MySQL), например, для рендера динамической страницы (и если эта самая страница не закеширована не сервере)?

Опять таки, запрос идет от одного пользователя, от имени которого запущен веб-сервер, который запускает php скрипт, который делает запрос. Нормальная база данных написана так, чтобы обрабатывать много парралельных запросов. Поэтому подобный вопрос имеет смысл поднимать только для очень нагруженных серверов, когда скорости не хватает, и нужно идти в оптимизацию/кластеризацию.

4) нужно одновременно записать в одну таблицу (MySQL) данные от нескольких пользователей? Например, они одновременно отправили комментарий?

Mysql обработает запросы по очереди, в порядке их поступления. Именно потому, что в базу пишут не разные скрипты одновременно, а сам сервер базы - параллельные запросы он поставит в очередь и выполнит.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
Adamos
@Adamos
Весь вопрос вокруг банальной и обычной для новичков ошибки.
Я считал что-то из базы, обработал и хочу записать.
Что будет, если между этими событиями база изменится?
Правильный ответ: база не должна изменяться между этими событиями.
Либо блокировка записей, либо - и желательно - правильные запросы, которые делают получение данных и их изменение атомарным.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Кое-что из перечисленного выстраивается в очереди, кое что может работать и параллельно (это настраивается).

Ну и ошибки могут быть, конечно, если код не рассчитан на параллельную работу.
Ответ написан
@metajiji
1) и 2) разные пользователи запустят скрипт, более ничего не произойдет. Проблемы могут быть, если этот скрипт пишет данные в файл. В таком случае данные в файле будут от последнего, кто запустил скрипт, а в случае записи в конец файла получим кашу :)
3) и 4) работа с базой по сети, там есть очередь коннектора и блокировок, причем это уже проблемы сервера, а не скрипта, можете не беспокоиться. Беспокоиться нужно если база в файле, например sqlite, msaccess, вот там блокировки нужно самостоятельно обрабатывать.
Ответ написан
Acuna
@Acuna
Заполнил свой профиль
Так ведь скрипт - это тот же index.php, то есть сам сайт по сути) Если уж совсем на пальцах, то сервер - это папка, где хранятся файлы, а браузер просматривает эти файлы (это и есть HTTP), что произойдет если миллион человек запросят файл index.php? Сервер им его отдаст, ибо это просто его просмотр. Это не многозадачность, это просто обращение к файлу. Другой вопрос если этот скрипт что-то пишет в другой текстовый файл (не в БД, БД это как раз многозадачность), то там будут возникать блокировки и вообще что угодно, вплоть до его повреждения. Но это уже из другой области вопрос, а вы про HTTP спрашиваете.
Ответ написан
Комментировать
@odinchuvak
Прошу прощения за дилетантский вопрос, но желание знать требует спросить.

К примеру, у меня на сервере есть 2 скрипта. Оба работают по принципу:

  1. Берут из бд запись,
  2. Выполняют с ней манипуляции,
  3. Сохраняют результат в бд.


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

По сути это та же история с файлами. Может ли несколько скриптов работать с одним файлом одновременно?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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