2024 年 PHP 日本大会

mysqlnd 插件 API

以下是 mysqlnd 插件 API 提供的函数列表:

  • mysqlnd_plugin_register()

  • mysqlnd_plugin_count()

  • mysqlnd_plugin_get_plugin_connection_data()

  • mysqlnd_plugin_get_plugin_result_data()

  • mysqlnd_plugin_get_plugin_stmt_data()

  • mysqlnd_plugin_get_plugin_net_data()

  • mysqlnd_plugin_get_plugin_protocol_data()

  • mysqlnd_conn_get_methods()

  • mysqlnd_result_get_methods()

  • mysqlnd_result_meta_get_methods()

  • mysqlnd_stmt_get_methods()

  • mysqlnd_net_get_methods()

  • mysqlnd_protocol_get_methods()

插件是什么以及插件机制如何工作并没有正式的定义。

插件机制中常见的组件包括:

  • 插件管理器

  • 插件 API

  • 应用程序服务(或模块)

  • 应用程序服务 API(或模块 API)

mysqlnd 插件概念采用了这些特性,并且还具有开放式架构。

无限制

插件可以完全访问 mysqlnd 的内部工作机制。没有任何安全限制。所有内容都可以被覆盖以实现友好或敌对的算法。建议您只部署来自可信来源的插件。

如前所述,插件可以自由使用指针。这些指针不受任何限制,可以指向另一个插件的数据。可以使用简单的偏移量算术来读取另一个插件的数据。

建议您编写协作插件,并且始终调用父方法。插件应始终与 mysqlnd 本身协作。

问题:链式调用和协作示例
扩展 mysqlnd.query() 指针 调用父方法时的调用栈
ext/mysqlnd mysqlnd.query() mysqlnd.query
ext/mysqlnd_cache mysqlnd_cache.query()
  1. mysqlnd_cache.query()

  2. mysqlnd.query

ext/mysqlnd_monitor mysqlnd_monitor.query()
  1. mysqlnd_monitor.query()

  2. mysqlnd_cache.query()

  3. mysqlnd.query

在这种情况下,加载了缓存 (ext/mysqlnd_cache) 和监控 (ext/mysqlnd_monitor) 插件。两者都继承了 Connection::query()。插件注册在 MINIT 使用前面显示的逻辑进行。默认情况下,PHP 按字母顺序调用扩展。插件彼此不知道,并且不设置扩展依赖项。

默认情况下,插件在其派生方法中调用查询方法的父实现。

PHP 扩展回顾

这是使用示例插件 ext/mysqlnd_plugin(它将 mysqlnd C 插件 API 公开给 PHP)时发生的情况的回顾。

  • 任何 PHP MySQL 应用程序都尝试建立与 192.168.2.29 的连接。

  • PHP 应用程序将使用 ext/mysqlext/mysqliPDO_MYSQL。所有三个 PHP MySQL 扩展都使用 mysqlnd 来建立与 192.168.2.29 的连接。

  • Mysqlnd 调用其 connect 方法,该方法已被 ext/mysqlnd_plugin 继承。

  • ext/mysqlnd_plugin 调用用户空间挂钩 proxy::connect()(由用户注册)。

  • 用户空间挂钩将连接主机 IP 从 192.168.2.29 更改为 127.0.0.1,并返回由 parent::connect() 建立的连接。

  • ext/mysqlnd_plugin 通过调用建立连接的原始 mysqlnd 方法来执行等效于 parent::connect(127.0.0.1) 的操作。

  • ext/mysqlnd 建立连接并返回到 ext/mysqlnd_pluginext/mysqlnd_plugin 也返回。

  • 无论应用程序使用了哪个 PHP MySQL 扩展,它都将收到与 127.0.0.1 的连接。PHP MySQL 扩展本身也返回到 PHP 应用程序。循环结束。

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top