Вопрос производительности PHP / MySQL - PullRequest
1 голос
/ 25 августа 2011

Только что задали быстрый вопрос тем из вас, кто знает о производительности. Я создал класс «MySQL», и каждый раз, когда я выполняю запрос, я создаю новый объект MySQL. Смотри ниже

    public function get_am_sales() {
        $mysql = new MySQL();
        $mysql->connect();
        $query = "some query";
        $mysql->query($query);
        $result = $mysql->return_assoc();
        unset($mysql);
        return $result;
    }

    public function get_pm_sales() {
        $mysql = new MySQL();
        $mysql->connect();
        $query = "some query";
        $mysql->query($query);
        $result = $mysql->return_assoc();
        unset($mysql);
        return $result;
    }

    public function get_comp_sales() {
        $mysql = new MySQL();
        $mysql->connect();
        $query = "some query";
        $mysql->query($query);
        $result = $mysql->return_assoc();
        unset($mysql);
        return $result;
    }

$sales = new Sales();
$amSales = $sales->get_am_sales();
$pmSales = $sales->get_pm_sales();
$compSales = $sales->get_comp_sales();

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

    public function connect() {
        $this->mysql = new MySQL();
        $this->mysql->connect();
    }

    public function get_am_sales() {
        $query = "SELECT site_id, dly_sls AS am_sales, cov_cnt AS am_covers
                  FROM v_sales_yesterday
                  WHERE am_pm = 'AM'
                  GROUP BY site_id
                  ORDER BY site_id ASC";
        $this->mysql->query($query);
        $result = $this->mysql->return_assoc();
        return $result;
    }

    public function get_pm_sales() {
        $query = "SELECT site_id, dly_sls AS pm_sales, cov_cnt AS pm_covers
                  FROM v_sales_today
                  WHERE am_pm = 'PM'
                  GROUP BY site_id
                  ORDER BY site_id ASC";
        $this->mysql->query($query);
        $result = $this->mysql->return_assoc();
        return $result;
    }

    public function get_comp_sales() {
        $query = "SELECT business_date, site_id, dly_sls AS comp_sales
                  FROM v_sales_today_comp 
                  WHERE am_pm = 'PM'
                  GROUP BY site_id
                  ORDER BY site_id ASC";
        $this->mysql->query($query);
        $result = $this->mysql->return_assoc();
        return $result;
    }

    public function disconnect() {
        unset($this->mysql);
    }

$sales = new Sales();
$sales->connect();
$amSales = $sales->get_am_sales();
$pmSales = $sales->get_pm_sales();
$compSales = $sales->get_comp_sales();
$sales->disconnect();

Соединение mysql закрывается после выполнения функции connect? Если это будет сочтено необходимым, что будет лучшим способом сохранить соединение открытым (используя объектно-ориентированный подход)? Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, и я заранее благодарен за помощь.

Ответы [ 2 ]

3 голосов
/ 25 августа 2011

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

http://net.tutsplus.com/tutorials/php/real-world-oop-with-php-and-mysql/

имеет то, что вы ищете.

1 голос
/ 25 августа 2011

Как правило, вы хотите создать экземпляр MySQL только один раз во время выполнения приложения.

Если у вас есть всеобъемлющий объект Application, вы можете просто создать свой экземпляр MySQL внутри объекта Application и получить доступэто оттуда.

Другой альтернативой является создание Singleton объекта для вашего экземпляра MySQL, к которому затем осуществляется доступ с помощью метода instance ().

Таким образом, вы открываете только одно соединение во время цикла выполнения вашего php-скрипта, и оно будет отброшено в конце выполнения скрипта.

Так что теперь ваш код выглядит так:

$query = "SELECT * FROM users";

$rs = Mysql::instance()->query($query);

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

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