如何将 ORM 添加到 PHP 遗留项目?

Posted

技术标签:

【中文标题】如何将 ORM 添加到 PHP 遗留项目?【英文标题】:How to add ORM to a PHP legacy project? 【发布时间】:2009-03-06 12:50:12 【问题描述】:

我们正在开发一个 php 项目,该项目已经开发了 2 年多,现在团队已准备好并愿意将开发切换到 ORM。因为它确实加快了开发速度,让您可以通过 Objects 来操作,而不是大多数时候考虑 SQL 代码和数据库表。

我们决定选择Doctrine ORM,因为它加载了 YAML 数据夹具 - 我们非常需要它来进行单元测试。

我主要担心的是,使用新的 ORM 框架会降低网站的性能。我们无法在当前数据库抽象层之间建立共享连接(它使用pg_connect 语法,不兼容PDO)。数据库连接机制不能切换到PDO-compatible,因为有很多SQL代码不兼容PDO_SQLITE语法。

所以,据我了解,如果我们开始使用它,它将使数据库连接数增加一倍。我不确定数据库服务器是否能够处理这个问题。

在这种情况下,您会建议我们做什么?

【问题讨论】:

【参考方案1】:

PDO_SQLITE 有什么相关性?

除非您确实计划使用 SQLite 驱动程序,否则 PDO 不强制要求兼容性。

如果您不打算使用 SQLite,那么我将使旧数据库层 PDO 兼容并重新使用连接,直到您可以完全迁移到 Doctrine。

也就是说,连接级别并不是迁移到 ORM 的唯一性能问题。它们本质上是低效的,因此我希望查询速度较慢,应用程序服务器和数据库服务器之间的带宽使用量更高,以及由于不可避免地选择冗余数据而导致应用程序级别的内存使用量更高。 根据您当前的设置,上述可能有问题,也可能没有问题。

您可能应该对最后一段持保留态度,因为它们只是一般 ORM 的特征,而不是具体的 Doctrine,我没有经验。

【讨论】:

【参考方案2】:

您可以做的显而易见的事情是在需要之前不要打开数据库连接。我个人使用这样的代码:

public function connect() 
  if (!defined('CONNECT')) 
    mysql_connect(...);
  


public function db_query($query) 
  connect();
  $ret = mysql_query($query);
  if (!$ret) 
    die(mysql_error());
    error_log(mysql_error() . ' - ' . $query);
  
  return $ret;

减少重复次数,只在需要时打开连接。

在你的情况下,你需要打破你可以开始的最小块。理想情况下,它应该是一个垂直切片,这意味着这个切片将使用新代码完成几乎所有的数据库工作,而很少使用旧代码。通过这种方式,您可以最大限度地减少数据库连接的倍增,这可以让您积累一些技能并获得一些经验。

但请注意,ORM 绝不是灵丹妙药。您可能讨厌 SQL,并发现它很繁琐且容易出错,但在大多数情况下,您只是简单地将一组问题换成另一组问题。我个人认为,虽然 ORM 可能有用,但它被夸大了,而且比许多人意识到或愿意承认的更虚假经济。我在Using an ORM or plain SQL? 中写了更多关于此的内容@

我并不是说你不应该这样做。只是不要以为它会解决你所有的问题。此外,由于这种重写实际上根本不会改变功能(根据您所描述的),我不确定这样做的成本是否与修复已经存在的东西相比是否有利。太多的未知数无法说明您的情况会如何发展。

【讨论】:

【参考方案3】:

嗯,是的,也不是——只要您同时拥有非 PDO 和 PDO 连接,您的 DB 连接只会翻倍。

我不确定您对 PDO_SQLITE 参考的意思是什么,因为 SQLite 是一个与您现在使用的 PostgreSQL 完全不同的数据库。

您应该能够像今天一样通过 PDO::query 运行当前查询,除非您做错了什么:)

【讨论】:

以上是关于如何将 ORM 添加到 PHP 遗留项目?的主要内容,如果未能解决你的问题,请参考以下文章

将代理 id 键添加到遗留数据库中的无键表;它会如何影响与数据库通信的业务应用程序? [关闭]

如何将 Spring Boot 项目迁移到旧 Spring MVC 项目。面临的问题,如何在遗留 Spring MVC 项目中读取 application.properties 文件

如何将JUnit 4测试添加到JUnit 3测试套件中

如何将 parse.com php sdk 添加到 symfony

如何将flask_sqlalchemy orm中的数据添加到WTForm FieldList?

我正在尝试使用此代码将项目添加到数据库中,但它不会将它们添加到数据库中。如何使用带有 ajax 的 PHP CODE 使用 POST METHOD?