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() |
|
ext/mysqlnd_monitor | mysqlnd_monitor.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에 대한 연결을 설정합니다. -
mysqlnd
는ext/mysqlnd_plugin
에 의해 서브클래싱된 connect 메소드를 호출합니다. -
ext/mysqlnd_plugin
은 사용자가 등록한 userspace hookproxy::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 애플리케이션으로 돌아갑니다. 원이 닫혀 있습니다.