Страницы PHP на сервере работают одновременно? - PullRequest
3 голосов
/ 05 января 2012

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

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

Возьмите это как пример. У меня есть один товар в моем интернет-магазине, управляемом PHP. Пользователь добавляет это в свою корзину. PHP-скрипт 1) проверяет, есть ли он в наличии, да, его есть в наличии, поэтому он 2) резервирует его для него.

Что если между проверкой наличия ее на складе и ее резервированием загружалась та же страница PHP для кого-то другого, и сразу после того, как пользователь А проверил наличие на складе, то же самое сделал пользователь Б, прежде чем у пользователя А появилась возможность зарезервировать его, чтобы они оба забронировали его!

Извините, если это кажется глупым, не могу найти ответ на него, что это?

Ответы [ 4 ]

7 голосов
/ 05 января 2012

Поздравляем, вы определили состояние гонки !: -)

Будет ли страница PHP работать параллельно или одна за другой, зависит от веб-сервера.Обычно веб-сервер выделяет несколько потоков для обработки нескольких входящих запросов одновременно.Таким образом, может случиться так, что несколько экземпляров одного и того же скрипта будут запущены параллельно, если два или более пользователей одновременно запросят одну и ту же страницу.Из-за различий во времени и расписании непредсказуемо, когда каждая страница будет выполнять какое именно действие.

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

2 голосов
/ 05 января 2012

Да, в общем, не вдаваясь в подробности: PHP-скрипты выполняются одновременно для каждого запроса отдельно .

Чтобы убедиться, что упомянутая вами проблема не возникает, вам, вероятно, следует реализовать функцию вашей системы управления базами данных, которая называется " транзакций ". Таким образом, если вы что-то делаете на уровне базы данных и в конце обнаружите, что резервирование не может быть выполнено, все действия, выполненные в транзакции, будут отменены.

В дополнение к транзакциям вам следует разработать приложение, помня о том, что упомянутая вами проблема может возникнуть . Таким образом, вы должны разработать свою базу данных и приложение таким образом, чтобы вы: 1) максимально сократили время между «проверкой» и «резервированием», 2) прекращением действия, если вы не можете сделать резервирование, и, наконец, - в случае крайней необходимости. - 3) определение того, какая оговорка возникла первой, а какая должна быть отозвана.

Другая идея, попадающая в категорию " дизайн вашего приложения ", может быть чем-то, что мы могли бы назвать " временное резервирование ". Это означает, что вы можете временно (например, на пару секунд) заблокировать вашу бронь, если вы собираетесь сделать бронь. После этого вы можете проверить, действительно ли вы можете сделать это бронирование и либо превратить его в постоянное бронирование, либо просто отменить его. Я полагаю, что некоторые системы также делают более длительные временные резервирования сразу после того, как клиент начинает процесс резервирования своих мест. Затем, если процесс успешен, резервирование изменяется на постоянное, но если некоторое определенное количество времени проходит без успеха, резервирование может быть просто отменено, позволяя другому клиенту начать процесс.

0 голосов
/ 05 января 2012

Да, безусловно, они параллельны для php, но когда речь идет о базе данных, вы должны изучить часть транзакции системы управления базами данных.

0 голосов
/ 05 января 2012

Да и нет.PHP может работать в одновременных процессах в зависимости от настроек сервера, но в небольших масштабах у вас будет только одна база данных.Запросы к базе данных обрабатываются последовательно, поэтому такого конфликта никогда не будет.(Пока вы проверяете, есть ли товар на складе, перед тем, как зарезервировать его для кого-то.) Дополнительная информация

Конечно, пользователи A + B могут оба видеть, что он есть в наличии, и A может запросить его раньше B. Но ваш код может понять, что его сейчас нет в наличии, и вывести ошибку пользователю B.

(У вас проблемы с несколькими серверами баз данных. Если у вас одинаковые данныехранящиеся на нескольких серверах, до полной репликации данных есть время задержки. Но у вас не возникнет этой проблемы. Мы говорим о 1000 лучших сайтах здесь.)

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