为什么PHP的mysql

这个问题在这里已经有了答案:

  • 为什么我不应该在PHP中使用mysql_ *函数? 14个答案

  • 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版本的工作是工作,我们可能可以花更多的时间。


    为什么他们弃用?

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

    是的,库的内部代码存在问题,这意味着它需要被替换,但如果API首先被设计的更好,那么mysqli库不需要被写入; 改进的代码可以简单地交换到现有的库中,我们可以像开发人员一样继续使用现有的功能,而无需知道事情在内部发生了变化。

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

    因此,他们的最佳行动方案是提供新的API并弃用旧的API。


    弃用

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

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

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

    这取决于。

  • 对于遗留代码,我怀疑值得开始进行紧急重写。
  • 至于全新的项目 - 答案相当简单:
  • 你只是不应该在应用程序代码中使用任何API调用,而只能在DBAL库中使用。

    它不仅会使整个驱动程序问题变得微不足道(因为您只需要重写相对较小的库代码以更改驱动程序),而且它还可以使您的代码大大缩短和更简洁。

    性能

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

    让我们把你的问题链接起来。

    通过在循环中包含连接代码,作者仅仅对连接时间进行基准测试,而不是他想要测量的内容。 结果是相当可预测的。
    因为

  • 已知连接是相对资源消耗的操作
  • mysql_connect()永远不会实际重新连接 (如果没有明确告知),而是使用上次打开的连接。
  • 所以我们的mysql ext显着加快了结果。 难怪,因为mysqli和PDO都必须连接数千次,而mysql只需连接一次。

    将迭代代码中的连接删除后,结果会发生显着变化, 显示完全不重要。

    在这个测试中还有很多其他的缺陷,但这个想法依然如此:

    永远不要从空中运行闲置的基准测试。 但是,只有在真实环境中有理由并且真实的情况下,才需要做任何基准测试。 否则,你会测量任何有意义的数字

    链接地址: http://www.djcxy.com/p/26575.html

    上一篇: Why are PHP's mysql

    下一篇: PHP 5.4 on IIS is adding slashes after quote automatically