Как добавить ORM в устаревший проект PHP?
Мы работаем над проектом PHP, который разрабатывался более 2 лет, и теперь команда готова и чувствует желание переключить разработку на ORM. Потому что это действительно ускоряет разработку и позволяет вам работать с объектами, а не думать с точки зрения кода SQL и таблиц базы данных большую часть времени.
Мы решили выбрать Doctrine ORM, потому что он имеет загрузку данных YAML - он нам очень нужен для наших юнит-тестов.
Основной страх, который я испытываю, заключается в том, что использование новой платформы ORM может замедлить работу сайта. Мы не можем установить общее соединение между текущим уровнем абстракции базы данных (который использует pg_connect
синтаксис, не совместимый с PDO). Механизм подключения к базе данных не может быть переключен на PDO-совместимый, потому что есть много кода SQL, несовместимого с синтаксисом PDO_SQLITE.
Итак, насколько я понимаю, если мы начнем использовать его, он удвоит количество подключений к базе данных. Я не уверен, что сервер базы данных сможет справиться с этим.
Что бы вы посоветовали нам сделать в таких обстоятельствах?
3 ответа
Какое отношение имеет PDO_SQLITE?
Если вы на самом деле не планируете использовать драйвер SQLite, то совместимость не требуется PDO.
Если вы не собираетесь использовать SQLite, тогда я сделаю совместимым устаревший PDO уровня базы данных и повторно использую соединения, пока вы не сможете полностью перейти на Doctrine.
Тем не менее, уровень соединений не будет вашей единственной проблемой производительности при переходе на ORM. Они по своей сути неэффективны, поэтому я ожидаю более медленные запросы, более широкое использование полосы пропускания между серверами приложений и серверами баз данных и более широкое использование памяти на уровне приложений из-за неизбежного выбора избыточных данных. В зависимости от вашей текущей настройки, вышеупомянутые могут или не могут быть проблемы.
Вы, вероятно, должны взять этот последний абзац с щепоткой соли, потому что это всего лишь черты ORM в целом, а не Doctrine в частности, с которыми у меня не было опыта.
Очевидная вещь, которую вы можете сделать, это не открывать соединение с базой данных, пока оно вам не понадобится. Я лично использую такой код:
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?
Я не говорю, что ты не должен этого делать. Только не думайте, что это решит все ваши проблемы. Кроме того, так как это переписывание фактически не изменит функциональность вообще (из того, что вы описали), я не уверен, что затраты на это выгодно отличаются от исправления того, что уже есть. Слишком много неизвестных, чтобы сказать, в какую сторону пойдет ваша ситуация.
Да, да и нет - ваши соединения с БД будут удваиваться только при условии, что у вас есть и не-PDO, и PDO-соединение.
Я не уверен, что вы имеете в виду под ссылкой PDO_SQLITE, поскольку SQLite - это совершенно другая база данных, чем PostgreSQL, которую вы, похоже, используете сейчас.
Вы должны иметь возможность выполнять свои текущие запросы через PDO::query так же, как вы делаете это сегодня, если вы не делаете что-то очень неправильно:)