Mysqlnd
插件和 MySQL 代理是使用不同方法的不同技术。两者都是用于解决各种常见任务的有效工具,例如负载平衡、监控和性能增强。一个重要的区别是 MySQL 代理与所有 MySQL 客户端一起使用,而 mysqlnd
插件是特定于 PHP 应用程序的。
作为 PHP 扩展,mysqlnd
插件与 PHP 的其余部分一起安装在 PHP 应用程序服务器上。MySQL 代理可以在 PHP 应用程序服务器上运行,也可以安装在专用机器上以处理多个 PHP 应用程序服务器。
在应用程序服务器上部署 MySQL 代理有两个优点
没有单点故障
易于扩展(水平扩展,按客户端扩展)
MySQL 代理(和 mysqlnd
插件)可以轻松解决原本需要更改现有应用程序才能解决的问题。
但是,MySQL 代理也有一些缺点
MySQL 代理是一个新的组件和技术,需要掌握和部署。
MySQL 代理需要 Lua 脚本语言知识。
MySQL 代理可以使用 C 和 Lua 编程进行自定义。Lua 是 MySQL 代理的首选脚本语言。对于大多数 PHP 专家来说,Lua 是一种需要学习的新语言。一个 mysqlnd
插件可以用 C 编写。也可以使用 » PECL/mysqlnd_uh 用 PHP 编写插件。
MySQL 代理作为守护进程运行 - 后台进程。MySQL 代理可以回忆起之前的决定,因为所有状态都可以保留。但是,mysqlnd
插件绑定到 PHP 的基于请求的生命周期。MySQL 代理还可以跨多个应用程序服务器共享一次性计算的结果。一个 mysqlnd
插件需要将数据存储在持久介质中才能实现此目的。需要为此目的使用另一个守护进程,例如 Memcache。在这种情况下,MySQL 代理具有优势。
MySQL 代理在有线协议之上运行。使用 MySQL 代理,您必须解析和反向工程 MySQL 客户端服务器协议。操作仅限于通过操作通信协议可以实现的操作。如果有线协议发生变化(这种情况非常少见),则也需要更改 MySQL 代理脚本。
Mysqlnd
插件在 C API 之上运行,该 API 镜像了 libmysqlclient
客户端。这个 C API 基本上是 MySQL 客户端服务器协议(有时也称为有线协议)的包装器。您可以拦截所有 C API 调用。PHP 使用 C API,因此您可以钩住所有 PHP 调用,而无需在有线协议级别进行编程。
Mysqlnd
实现有线协议。因此,插件可以解析、反向工程、操纵甚至替换通信协议。但是,这通常不是必需的。
由于插件允许您创建使用两个级别(C API 和有线协议)的实现,因此它们比 MySQL 代理具有更大的灵活性。如果一个 mysqlnd
插件是使用 C API 实现的,则有线协议的任何后续更改都不需要更改插件本身。