Php MySQL连接:全局还是在对象中?

Php MySQL连接:全局还是在对象中?,php,mysql,database,class,object,Php,Mysql,Database,Class,Object,我有两个PHP类。一种是连接到数据库、构建查询、执行查询以及断开与数据库的连接。另一个类用于用户:添加、更新、登录等 我正在讨论是否应该全局连接到页面上的数据库并使用该连接(将数据库对象传递到用户对象的方法中),或者是否应该从用户方法本身内部连接并断开与数据库的连接 我看到的全局连接的优点是,一旦连接,我就可以使用该连接执行多个方法。缺点是我需要担心数据库对象的传递 在该方法中连接的优点是它是完全透明的,但是,可能会建立4或5个连接并断开连接,这可能会导致开销 是否存在使用这两种方法的最佳实践,

我有两个PHP类。一种是连接到数据库、构建查询、执行查询以及断开与数据库的连接。另一个类用于用户:添加、更新、登录等

我正在讨论是否应该全局连接到页面上的数据库并使用该连接(将数据库对象传递到用户对象的方法中),或者是否应该从用户方法本身内部连接并断开与数据库的连接

我看到的全局连接的优点是,一旦连接,我就可以使用该连接执行多个方法。缺点是我需要担心数据库对象的传递

在该方法中连接的优点是它是完全透明的,但是,可能会建立4或5个连接并断开连接,这可能会导致开销

是否存在使用这两种方法的最佳实践,或者它是否真的取决于用户数量和服务器规格(例如内存、cpu等)。系统需要支持多达1000个用户,因此规模相当小

如有任何反馈,将不胜感激


-Ryan

创建一个函数,用于按需创建连接并提供对连接对象的访问:

function getDb()
{
    static $db;
    if (!$db) $db = ...;
    return $db;
}

封装到类中,这种方法在PHP中称为
Singleton
,最佳实践是采用全局方法。这主要是因为重复连接/断开MySQL服务器会导致性能显著下降


事实上,尽管这似乎有悖常理,但大多数PHP专家(包括我自己)建议您完全避免使用mysql_close(),除非有迫切的理由不这样做。这是因为在PHP的清理过程中会自动处理,因此添加mysql_close()只会进一步降低性能。

一定要跟踪并重用基本DB类中的单个连接。上面是一个根据需要从DB类创建和返回连接的好例子

为了使从实际对象访问该连接更容易,您可以创建一个基本对象类(称为DBable之类的),该类在其构造函数中调用getDb,并将其分配给该类中的本地$db变量。然后,所有需要访问数据库的对象都可以扩展该DBable类,并且总是隐式地提供$db引用,而无需记住在任何地方调用getDb

我正在讨论是否应该全局连接到页面上的数据库并使用该连接(将数据库对象传递到用户对象的方法中),或者是否应该从用户方法本身内部连接并断开与数据库的连接

停止辩论。使数据库类对需要它的函数可用,并透明地处理连接,以便每个请求有一个连接。执行多个连接/断开连接是多余的,只会产生太多不需要完成的工作

所以实际上您只需要一个连接变量(object)。将其提供给需要它的函数(例如,将其作为成员的数据库类),您就可以了。是否使该对象全局可用是您的设计决策


另外,请查看名为和/或的模式。可能这就是你对用户对象所做的,因此你不需要重新发明轮子,你可以使用现有的库,这样你就可以更好地专注于需要在应用程序中完成的实际工作。

这个函数驻留在哪里?在一个对象中还是在全局范围内?@Ryan S:您可以只使用函数,也可以创建一个静态的methodFunctions,我称之为陷阱。它们甚至比全局或静态类数据库变量更糟糕。我只是留下一个大的警告标志,因为我在多个项目中看到过这会导致问题。这就是为什么我需要对此提出警告,否则我会忽视我的专业经验。我不仅仅是非黑即白的,所以我对全局的,甚至是单个类实例都很松懈,但是这种结构的函数在特定情况下会对维护应用程序造成很大的危害。就是这样,不是说它可以被称为xyz,而是说它建议了具体的实现。例如,全局方法在使用seam时提供了一个更容易的方法。全局方法在任何编程语言中都不是一个好的实践,因为它很难管理。我不同意这个答案。正如@zerkms所指出的,全球方法不是一个好主意。只连接到数据库一次是个好主意,但是有更好的方法可以做到这一点,不会使全局名称空间变得混乱,使测试变得不可能。使用单例模式是一种方法,尽管它也会使测试变得困难。研究依赖注入或尝试类似于zerkms函数的方法。@rdlowrey:+1,但DI是一个复杂的解决方案,它意味着深厚的理论知识和经验,以及代码测试本身。所以就我个人而言,我更喜欢单例作为良好设计的第一步;-)@虫族你可能是对的。。。据说人们学习的第一个设计模式通常是单体。这是一个很好的起点。@rdlowrey我认为Ryan使用“全局”一词时所指的不是将连接处理程序分配给全局变量(我同意这不是一个好主意!),而是只创建一次连接,然后根据需要传递该db对象,而无需每次连接/断开与MySQL的连接。这正是我的回答所要明确指出的我强烈建议实例化一次,然后将连接注入到对象中。试试谷歌搜索“PHP依赖注入”。这不是一个坏主意,但PHP缺乏多重继承,这使得为该功能使用父类成了问题。每