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()

플러그인이 무엇이고 플러그인 메커니즘이 어떻게 작동하는지에 대한 공식적인 정의는 없습니다.

플러그인 메커니즘에서 자주 발견되는 구성 요소는 다음과 같습니다.

  • A plugin manager
  • A plugin API
  • Application services (or modules)
  • Application service APIs (or module APIs)

mysqlnd 플러그인 개념은 이러한 기능을 사용하며 추가로 개방형 아키텍처를 즐깁니다.

제한 없음

플러그인은 mysqlnd의 내부 작업에 대한 전체 액세스 권한을 가집니다. 보안 제한이나 제한이 없습니다. 우호적이거나 적대적인 알고리즘을 구현하기 위해 모든 것을 덮어쓸 수 있습니다. 신뢰할 수 있는 소스의 플러그인만 배포하는 것이 좋습니다.

앞서 논의한 바와 같이 플러그인은 포인터를 자유롭게 사용할 수 있습니다. 이 포인터는 어떤 식으로든 제한되지 않으며 다른 플러그인의 데이터를 가리킬 수 있습니다. 간단한 오프셋 산술을 사용하여 다른 플러그인의 데이터를 읽을 수 있습니다.

협력 플러그인을 작성하고 항상 상위 메소드를 호출하는 것이 좋습니다. 플러그인은 항상 mysqlnd 자체와 협력해야 합니다.

이슈: 연쇄와 협력의 예

Extension mysqlnd.query() pointer call stack if calling parent
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 Extension Recap

다음은 mysqlnd C 플러그인 API를 PHP에 노출하는 예제 플러그인인 ext/mysqlnd_plugin을 사용할 때 발생하는 일을 요약한 것입니다.

  • 모든 PHP MySQL 애플리케이션은 192.168.2.29에 대한 연결을 설정하려고 합니다.
  • PHP 애플리케이션은 ext/mysql, ext/mysqli 또는 PDO_MYSQL을 사용합니다. 세 가지 PHP MySQL 확장은 모두 mysqlnd를 사용하여 192.168.2.29에 대한 연결을 설정합니다.
  • mysqlndext/mysqlnd_plugin에 의해 서브클래싱된 connect 메소드를 호출합니다.
  • ext/mysqlnd_plugin은 사용자가 등록한 userspace hook 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_plugin으로 돌아갑니다. ext/mysqlnd_plugin도 반환됩니다.
  • 어떤 PHP MySQL 확장이 애플리케이션에서 사용되었든 127.0.0.1에 대한 연결을 수신합니다. PHP MySQL 확장 자체가 PHP 애플리케이션으로 돌아갑니다. 원이 닫혀 있습니다.