Как добавить ORM в устаревший проект PHP?

Мы работаем над проектом PHP, который находится в разработке более 2 лет, и теперь команда готова и чувствует готовность переключить разработку на ORM. Потому что это действительно ускоряет разработку и позволяет вам работать с объектами, а не думать в терминах кода SQL и таблиц базы данных большую часть времени.

Мы решили выбрать ORM Doctrine, поскольку в нем загружены фикстуры данных YAML. - он нам очень нужен для наших юнит-тестов.

Я больше всего опасаюсь, что использование нового ORM-фреймворка может снизить производительность сайта. Мы не можем установить общее соединение между текущим уровнем абстракции базы данных (который использует синтаксис pg_connect, а не PDO -совместимо). Механизм подключения к базе данных нельзя переключить на PDO-совместимый, потому что есть много кода SQL, несовместимого с синтаксисом PDO_SQLITE.

Так что, насколько я понимаю, если мы начнем его использовать, количество подключений к базе данных увеличится вдвое. Я не уверен, что сервер базы данных сможет с этим справиться.

Что бы вы порекомендовали нам сделать в таких обстоятельствах?


person Nikita Fedyashev    schedule 06.03.2009    source источник


Ответы (3)


Какое значение имеет PDO_SQLITE?

Если вы на самом деле не планируете использовать драйвер SQLite, PDO не требует совместимости.

Если вы не собираетесь использовать SQLite, я бы сделал PDO уровня устаревшей базы данных совместимым и повторно использовал бы соединения, пока вы не сможете полностью перейти на Doctrine.

Тем не менее, уровень соединений не будет вашей единственной проблемой производительности при переходе на ORM. Они по своей сути неэффективны, поэтому я бы ожидал более медленных запросов, более высокой пропускной способности между серверами приложений и серверами баз данных и более высокого использования памяти на уровне приложений из-за неизбежного выбора избыточных данных. В зависимости от ваших текущих настроек, вышеуказанные проблемы могут быть, а могут и не быть.

Вам, вероятно, следует отнестись к этому последнему абзацу с долей скепсиса, потому что это просто черты ORM в целом, а не Doctrine в частности, с которыми у меня не было опыта.

person Mike    schedule 06.03.2009

Очевидная вещь, которую вы можете сделать, - это не открывать соединение с базой данных, пока оно вам не понадобится. Я лично использую такой код:

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 может быть полезным, оно было преувеличено и представляет собой скорее ложную экономию, чем многие понимают или готовы признать. Подробнее об этом я писал в Использование ORM или простого SQL?

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

person cletus    schedule 06.03.2009

Что ж, да и нет - ваши соединения с БД будут удваиваться только до тех пор, пока у вас есть соединение, не являющееся PDO, и соединение PDO.

Я не уверен, что вы имеете в виду под ссылкой на PDO_SQLITE, поскольку SQLite - это совершенно другая база данных, чем PostgreSQL, похоже, вы сейчас используете.

Вы должны иметь возможность запускать свои текущие запросы через PDO :: query так же, как и сегодня, если только вы не делаете что-то очень неправильно :)

person mikl    schedule 06.03.2009