为什么 PHP 的 mysql_ 函数被弃用?

2022-08-30 17:14:25

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

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

考虑到所有这些,为什么这些函数被弃用了?mysql_


答案 1

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版本一起工作是工作,我们可能可以更好地利用这段时间。


答案 2

折旧

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

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

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

这要视情况而定。

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

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

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

性能

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

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

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

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

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

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

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

永远不要突然运行空闲的基准测试。但是,只有在您有理由并且在真实环境中,才始终进行任何基准测试。否则,除了任何有意义的数字之外,你都会测量任何东西


推荐