2011-08-25 64 views
1

对于那些对性能有深入了解的人来说,这只是一个简单的问题。我创建了一个“MySQL”类,每次执行查询时,我都会创建一个新的MySQL对象。见下面PHP/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连接是否关闭?如果认为有必要,那么保持连接打开的最佳方式是什么(使用面向对象的方法)?如果您需要更多的细节,请告诉我,我很感谢您的帮助。

+0

你得到的错误是什么?通常情况下,您不能重新连接。为了防止多重连接,你还应该为你的DB类使用[singleton-pattern](http://php.net/manual/en/language.oop5.patterns.php#language.oop5.patterns.singleton)。 – feeela

+0

我在尝试查询时遇到错误,这导致我认为连接在查询之前关闭。 – Brett

+0

好的,我再问一次:你得到了什么/哪个错误?停止假设,尝试测试或调试。 – feeela

回答

1

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

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

另一种选择是为您的MySQL实例创建一个Singleton对象,然后通过“实例()”方法对其进行访问。

这样,你只在php脚本的执行周期中打开一个连接,它将在脚本执行结束时被丢弃。

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

$query = "SELECT * FROM users"; 

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

如果你需要,你可以如何设置看你的目的Singleton实例工作实例: