PHP / MySQL性能问题

时间:2011-08-25 15:18:14

标签: php mysql performance oop

对于那些了解性能的人来说,只是有一个快速的问题。我创建了一个“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();

“connect”函数执行后mysql连接是否关闭?如果认为有必要,保持连接打开的最佳方法是什么(使用面向对象的方法)?如果您需要更多详细信息,请告诉我,我提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

这完全没必要。您不必为每个查询打开和关闭连接。你在使用某种框架吗?如果不是,您必须因为所有框架都有活动记录和DB帮助程序,以便更容易与DB交互。这对你来说是一篇很棒的文章

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

正是你所期待的。

答案 1 :(得分:1)

通常,您只想在执行应用程序期间创建一次MySQL实例。

如果你有一个总体的Application对象,那么你可以在Application对象中创建你的MySQL实例并从那里访问它。

另一种方法是为MySQL实例创建一个Singleton对象,然后通过'instance()'方法进行访问。

这样,您只需在php脚本的执行周期内打开一个连接,并在脚本执行结束时将其丢弃。

所以现在你的代码看起来像这样:

$query = "SELECT * FROM users";

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

如果您需要有关如何设置Singleton实例的工作示例,请查看: