Объектно-ориентированное кодирование в среде многопоточных запросов — PHP

Я пишу веб-приложение в объектно-ориентированном дизайне. Это приложение будет довольно часто взаимодействовать с базой данных. Несколько регулярных операций — это проверка разрешений ACL пользователя для запрошенной функции/метода, выполнение определенных функций и т. д. Короче говоря, база данных будет использоваться очень часто. Итак, мой вопрос здесь в том, что если я разработаю свое приложение с использованием ООП и объявлю переменные уровня класса, которые будут использоваться для установки входных данных, и если есть какой-либо параллельный или параллельный запрос, поступающий от другого пользователя, будут ли входные данные быть изменен??

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

ex:

class myProces{
var $input1;
var $input2;

    function process1($ip1, $ip2){
      $this->input1 = $ip1;
      $this->input2 = $ip2;
      $this->getDataDB();        
    }

    function getDataDB(){
     //do some database activity with the class level variables;
     // I would pass the values in the class level variables;
    $query = "select column from table where col1 = $this->input1 and col2= $this->input2"; 

    mysql_query($query);

    return something;
    }


}

Теперь, если у меня есть два пользователя, которые одновременно запускают мое приложение и вызывают функции в этом классе

пользователь1: $obj = новый myProces(); $объект->процесс1(1,2);

пользователь2: $obj = новый myProces(); $объект->процесс1(5,6);

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

Может ли кто-нибудь объяснить, хорош ли ООП для веб-приложений с большим количеством пользователей или разработчики должны выполнять какую-либо многопоточность ??


person macha    schedule 23.01.2011    source источник


Ответы (4)


Это не та проблема, о которой нужно беспокоиться. Каждое соединение с вашим веб-сервером порождает совершенно отдельный экземпляр интерпретатора PHP с совершенно отдельными дескрипторами памяти и ресурсов. Никакие объекты в одном не будут затронуты другим, никакие соединения с базой данных в одном не будут затронуты другим. Свойства вашего класса в одном процессе никогда не изменяются запросом в другом процессе.

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

person Dan Grossman    schedule 23.01.2011

Несколько вещей:

  1. Это не имеет ничего общего с ООП.
  2. PHP не поддерживает пользовательские потоки

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

Тем не менее, вы должны быть осторожны при работе с данными из базы данных. Пользователь 1 может прочитать что-то, затем Пользователь 2 может прочитать то же самое и обновить его до того, как Пользователь 1 закончит. Затем, когда пользователь 1 обновляет его, он может случайно перезаписать что-то, что сделал пользователь 2.

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

person Matthew    schedule 23.01.2011

Во-первых: попробуйте узнать о PDO (если только VAR перед переменными не означает, что вы используете PHP4).

Во-вторых: как сказали Конфорс и Гроссман, каждый пользователь получает разные экземпляры PHP.

В-третьих: эта проблема может возникать в проектах Java (и других), в которых используются статические объекты или статические методы. Не беспокойтесь об этом в PHP.

person luizfonseca    schedule 23.01.2011
comment
как PDO поможет мне? Это для использования нескольких баз данных для одного приложения, не так ли? - person macha; 23.01.2011
comment
Вы сказали: я пишу веб-приложение в объектно-ориентированном дизайне. PDO является объектно-ориентированным. И вам не нужно беспокоиться об экранировании строк и многом другом. (и PDO был написан на C, что означает «намного быстрее»). - person luizfonseca; 23.01.2011

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

person Vlad    schedule 23.01.2011