Почему функции mysql_ PHP устарели?

Играя в Дьяволе, немного помогайте мне, поскольку я прекратил использовать эти функции некоторое время назад, но вопрос является подлинным и, вероятно, имеет значение для многих пользователей SO.

Мы все знаем, что использование функций mysql_ неправильным образом может быть очень опасным, оно может оставить ваш сайт уязвимым и т.д., но правильно использовать эти функции можно защитить от SQL-инъекции и на самом деле честный бит быстрее, чем новые функции PDO.

Учитывая все это, почему функции mysql_ устарели?

Ответ 1

Расширение mysql является древним и существует с момента выпуска PHP 2.0, выпущенного 15 лет назад (!!); который является совершенно другим зверем, чем современный PHP, который пытается избавиться от плохих практик своего прошлого. Расширение mysql является очень сырым, низкоуровневым коннектором для MySQL, которому не хватает многих удобных функций, и поэтому его сложно применять правильно в безопасном режиме; это плохо для noobs. Многие разработчики не понимают SQL-инъекцию, а API-интерфейс mysql достаточно хрупкий, чтобы затруднить его предотвращение, даже если вы знаете об этом. Он заполнен глобальным состоянием (например, неявное соединение), что упрощает запись кода, который трудно поддерживать. Поскольку он старый, может быть неоправданно трудно поддерживать на уровне ядра PHP.

Расширение mysqli намного более новое и устраняет все вышеперечисленные проблемы. PDO также является довольно новым и устраняет все эти проблемы, а также больше.

Из-за этих причин * расширение mysql будет удалено когда-нибудь в будущем. Он выполнял свою работу в период расцвета, довольно плохо, но он это сделал. Время изменилось, появились лучшие практики, приложения стали более сложными и требуют более современного API. mysql выходит на пенсию, живет с ним.

Учитывая все это, нет причин продолжать использовать его, кроме инерции.


* Это мои общие рассудительные причины; для всей официальной истории, посмотрите здесь: https://wiki.php.net/rfc/mysql_deprecation

Ниже перечислены цитаты из этого документа:

Команда документации обсуждает ситуацию с безопасностью базы данных, и обучение пользователей удалению от обычно используемого ext/mysql расширение является частью этого.

Отказ от ext/mysql связан не только с безопасностью, но и с имея доступ ко всем функциям базы данных MySQL.

ext/mysql сложно поддерживать код. Он не получает новых функции. Сохраняя его актуальность для работы с новыми версиями libmysql или mysqlnd - это работа, мы, возможно, лучше.

Ответ 2

Устаревшие

Насколько я знаю, Oracle, ответственный за поддержку, просто отказался сделать это больше. Это, по-видимому, главная причина.

Все остальные причины - это лишь глупые оправдания. Есть тонна расширения в PHP того же возраста, счастливо работает и работает. Некоторые новые функции в современной версии не являются основанием для отказа от устаревших. И, конечно же, проблема с самой библиотекой не связана с самой библиотекой, а скорее с пользователями библиотеки.

означает ли это, что я должен перестать использовать их на своих сайтах?

Это зависит.

  • Для устаревшего кода я сомневаюсь, что стоит начать экстренное переписывание.
  • Что касается совершенно новых проектов - ответ довольно прост:

вы просто не должны использовать любые вызовы API в коде приложения, но только в библиотеке DBAL.

Это не только сделает проблему с целым драйвером незначительной (так как вам нужно будет переписать относительно небольшой библиотечный код для изменения драйверов), но также может сделать ваш код значительно короче и чище.

Производительность

Говоря о разнице в производительности, есть интересная вещь. Интернет действительно полный тестов, рассказывающих вам, что X быстрее Y по Z раз. Но как можно отличить хороший показатель от плохого? Трудно сказать в целом. Вообще говоря, при написании теста нужно понять, что они делают. К сожалению, большинство авторов тестов этого не делают.

Возьмите один связанный в своем вопросе.

Включая код подключения в цикле, автор просто сравнивает время соединения, но не то, что он должен был измерить. Результаты вполне предсказуемы. Потому что

  • Известно, что соединение
  • является относительно ресурсоемкой операцией
  • mysql_connect() никогда не пересоединяется (если не указано явно), а вместо этого использует последнее открытое соединение.

Таким образом, в результате мы получаем mysql ext быстрее. Неудивительно, что и mysqli, и PDO должны были подключаться все тысячи раз, в то время как mysql должен был подключаться только один раз.

Когда соединение удалено из итерированного кода, результаты резко меняются, показывает полное незнание.

В этом тесте много других ошибок, но идея остается той же:

НИКОГДА не запускайте холостые тесты из ниоткуда. Но всегда делайте какие-либо тесты только в том случае, если у вас есть причина и в реальной среде. В противном случае вы будете измерять что угодно, кроме любых значимых чисел.

Ответ 3

Почему они устарели?

Ну, основная причина в том, что API был плохо разработан. Библиотека mysqli была создана как прямая замена для нее, с лучшим дизайном API.

Да, есть проблемы с внутренним кодом для библиотеки, что означает, что его нужно заменить, но если API был лучше разработан в первую очередь, библиотека mysqli не должна была быть написана; улучшенный код мог просто быть заменен на существующую библиотеку, и мы, как разработчики, могли бы продолжать использовать существующие функции, даже не зная, что что-то изменилось внутри.

Однако это было не так. Первоначальный API имел некоторые критические недостатки в дизайне, что означало, что когда разработчики PHP хотели улучшить ситуацию, были проблемы, которые означали, что они не могли этого сделать.

Поэтому наилучшим способом действий для них было предоставление нового API и отказ от старого.

Ответ 4

Feature comparison

Поскольку в нем отсутствуют функции, которые просто ожидаются в наши дни, это уже не стоит поддерживать. Поскольку PHP пытается поддерживать тонкий API (...), вы можете ожидать, что он будет удален. Это похоже на IE7: вы не можете использовать его, пока он "не исчезнет". Вы должны прекратить использование самостоятельно.

Изображение из http://php.net/manual/en/mysqlinfo.api.choosing.php