关于mysql:为什么不推荐使用PHP的mysql_函数?

Why are PHP's mysql_ functions deprecated?

本问题已经有最佳答案,请猛点这里访问。

当我不久前停止使用这些函数时,在这里稍微扮演一个魔鬼拥护者的角色,但这个问题是真实的,可能对很多这样的用户很重要。

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

考虑到所有这些,为什么不推荐使用mysql_函数?


mysql扩展是很古老的,从15年前发布的php 2.0开始就存在了。!);这是一个明显不同于现代PHP的野兽,后者试图摆脱过去的坏习惯。MySQL扩展是一个非常原始的、低级的MySQL连接器,它缺乏许多便利功能,因此很难以安全的方式正确应用;因此,它对Noobs不利。许多开发人员不理解SQL注入,并且mysql api非常脆弱,即使您知道它,也很难防止它发生。它充满了全局状态(例如隐式连接传递),这使得编写难以维护的代码变得容易。由于它是旧的,所以很难在PHP核心级别维护它。

mysqli扩展是一个更新的版本,可以解决上述所有问题。PDO也是一个相当新的工具,可以解决所有这些问题,还有更多的问题。

由于这些原因*MySQL扩展将在将来某个时候被删除。它在全盛时期做得相当糟糕,但它做到了。随着时间的推移,最佳实践不断发展,应用程序变得更加复杂,需要更现代的API。MySQL已经退休了,继续生活吧。

考虑到所有这些,除了惯性,没有理由继续使用它。

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

该文档中的选项引用如下:

The documentation team is discussing the database security situation,
and educating users to move away from the commonly used ext/mysql
extension is part of this.

Moving away from ext/mysql is not only about security but also about
having access to all features of the MySQL database.

ext/mysql is hard to maintain code. It is not not getting new
features. Keeping it up to date for working with new versions of
libmysql or mysqlnd versions is work, we probably could spend that
time better.


贬低

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

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

does this mean I should cease to use them in my sites?

这要看情况而定。

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

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

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

性能

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

让我们把你的问题联系起来。

通过在循环中包含连接代码,作者只需要基准化连接时间,而不是他打算测量的时间。结果是可以预测的。因为

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

因此,我们的mysql ext速度非常快。怪不得,因为mysqli和pdo都必须连接上千次,而mysql只能连接一次。

从迭代代码中删除connect后,结果会发生显著变化,显示出完全不重要。

这项测试还有许多其他的陷阱,但其想法仍然是一样的:

永远不要把闲置的基准点从任何地方跑出来。但是,始终只在您有理由和在实际环境中进行基准测试的情况下才进行基准测试。否则,除了有意义的数字,你什么都可以测量。


为什么不推荐?

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

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

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

因此,对他们来说,最好的做法是提供一个新的API,并废除旧的API。


Feature comparison

因为它现在缺少人们简单期望的功能,所以不值得维护。当PHP试图保持一个瘦的API(…)时,您可以期望它最终被删除。就像IE7一样:在它"消失"之前,你不能指望使用它。你必须自己停止使用。

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