23

在我不久前停止使用这些功能时,在这里稍微玩一下 Devil's Advocate,但这个问题是真实的,并且可能对很多 SO 用户很重要。

我们都知道mysql_以错误的方式使用函数是非常危险的,它可能会使您的网站容易受到攻击等,但是正确使用这些函数可以防止 SQL 注入,并且实际上比新的 PDO 函数快一点。

考虑到这一切,为什么这些mysql_功能被弃用了?

4

4 回答 4

16

mysql 扩展是古老的,自 15 年前发布的 PHP 2.0 以来一直存在(!!);这与现代 PHP 截然不同,后者试图摆脱过去的不良做法。mysql 扩展是一个非常原始的、低级的 MySQL 连接器,它缺乏许多便利功能,因此很难以安全的方式正确应用;因此,这对新手不利。许多开发人员不了解 SQL 注入,而且 mysql API 非常脆弱,即使您知道它也很难阻止它。它充满了全局状态(例如隐式连接传递),这使得编写难以维护的代码变得容易。由于它很旧,因此在 PHP 核心级别上维护可能会非常困难。

mysqli 扩展更新了很多,并修复了上述所有问题。PDO 也是相当新的,它也修复了所有这些问题,还有更多。

由于这些原因* mysql 扩展将在未来某个时候被删除。它在鼎盛时期完成了它的工作,相当糟糕,但它做到了。时代在进步,最佳实践也在发展,应用程序变得更加复杂,需要更现代的 API。mysql 即将退休,请继续使用它。

鉴于这一切,除了惯性之外,没有理由继续使用它。


* 这些是我的常识总结原因;对于整个官方故事,请看这里:https ://wiki.php.net/rfc/mysql_deprecation

该文件中的选择引用如下:

文档团队正在讨论数据库安全情况,教育用户远离常用的 ext/mysql 扩展是其中的一部分。

 

远离 ext/mysql 不仅关乎安全性,还关乎能够访问 MySQL 数据库的所有功能。

 

ext/mysql 很难维护代码。它不是没有获得新功能。保持更新以使用新版本的 libmysql 或 mysqlnd 版本是可行的,我们可能可以更好地度过这段时间。

于 2013-05-31T14:44:46.680 回答
3

弃用

据我所知,负责支持的是 Oracle 人员,只是拒绝再这样做了。这似乎是主要原因。

所有其他原因都只是愚蠢的借口。在同龄的 PHP 中有大量的扩展,愉快地运行起来。现代版本中的一些新功能并不是弃用旧功能的理由。当然,图书馆本身没有安全问题,而图书馆用户则没有。

这是否意味着我应该停止在我的网站中使用它们?

这取决于。

  • 对于遗留代码,我怀疑是否值得开始进行紧急重写。
  • 至于全新的项目 - 答案相当简单:

您只是不应该在应用程序代码中使用任何API 调用,而只能在 DBAL 库中使用。

它不仅可以忽略整个驱动程序问题(因为您只需要重写一个相对较小的库代码即可更改驱动程序),而且它可以使您的代码显着缩短和清洁。

表现

说到性能差异,有一个有趣的事情要提。互联网上确实充满了告诉你 X 比 Y 快 Z 倍的基准。但是如何区分一个好的基准和一个坏的基准呢?一般情况下很难说。一般来说,在编写测试时,必须了解他们在做什么。不幸的是,大多数测试编写者都没有。

让我们在您的问题中链接一个。

通过在循环中包含连接代码,作者只是对连接时间进行了基准测试,而不是他打算测量的内容。结果是可以预见的。
因为

  • 已知连接是一个相对消耗资源的操作
  • mysql_connect()从不真正重新连接(如果没有明确告知),而是使用上次打开的连接。

因此,我们的 mysql ext 速度大大加快。难怪 mysqli 和 PDO 都必须连接数千次,而 mysql 只需连接一次。

从迭代代码中删除连接后,结果会发生巨大变化,显示完全无关紧要。

此测试中还有许多其他陷阱,但想法保持不变:

永远不要突然运行空闲基准测试。但是,只有在您有理由并且在真实环境中才进行任何基准测试。否则,您将测量任何有意义的数字

于 2013-05-31T14:49:48.080 回答
1

为什么它们被弃用?

好吧,根本原因是 API 设计不佳。该mysqli库是作为它的直接替代品而创建的,具有更好的 API 设计。

是的,库的内部代码存在问题,这意味着它需要被替换,但如果 API 一开始就设计得更好,则mysqli不需要编写库;改进后的代码可以简单地交换到现有的库中,我们作为开发人员可以继续使用现有的功能,甚至不需要知道内部发生了变化。

然而,事实并非如此。最初的 API 确实存在一些严重的设计缺陷,这意味着当 PHP 开发人员想要改进时,会出现一些问题,这意味着他们无法做到这一点。

因此,对他们来说最好的做法是提供新的 API 并弃用旧的 API。

于 2013-05-31T14:51:44.623 回答
-1

功能比较

由于它缺乏当今人们所期望的功能,因此不再值得维护。由于 PHP 试图保持精简的 API (...),您可以预期它最终会被删除。就像 IE7:在它“消失”之前,你不能指望使用它。您必须自己停止使用。

图片来自http://php.net/manual/en/mysqlinfo.api.choosing.php

于 2013-05-31T14:51:47.737 回答