АрхитСктура ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² MySQL Native Driver

Π’ сСкции рассматриваСтся Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° mysqlnd.

ΠžΠ±Π·ΠΎΡ€ MySQL Native Driver

ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² для Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° mysqlnd ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½ сам Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ mysqlnd. Mysqlnd состоит ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ:

ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ схСма mysqlnd, ΠΏΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎ
ΠœΠΎΠ΄ΡƒΠ»ΠΈ статистики mysqlnd_statistics.c
Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ mysqlnd.c
Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ mysqlnd_result.c
ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π½Π°Π±ΠΎΡ€Π° mysqlnd_result_meta.c
ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ mysqlnd_ps.c
Π‘Π΅Ρ‚ΡŒ mysqlnd_net.c
ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΎΠ±ΠΌΠ΅Π½Π° mysqlnd_wireprotocol.c

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ориСнтированная ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ° C

На ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ΄Π°, mysqlnd ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ C для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°.

Π’ C ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ struct. Π§Π»Π΅Π½Ρ‹ структуры ΡΠ²Π»ΡΡŽΡ‚ΡΡ свойствами ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π§Π»Π΅Π½Ρ‹ структуры, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΡ… языков ΠΊΠ°ΠΊ C++ ΠΈΠ»ΠΈ Java, Π² C Π½Π΅Ρ‚ фиксированных ΠΏΡ€Π°Π²ΠΈΠ» наслСдования. Однако ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ договорённости, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ, Π½ΠΎ это ΠΌΡ‹ обсудим ΠΏΠΎΠ·ΠΆΠ΅.

Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» PHP

ΠŸΡ€ΠΈ рассмотрСнии ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° PHP сущСствуСт Π΄Π²Π° основных Ρ†ΠΈΠΊΠ»Π°:

  • Π¦ΠΈΠΊΠ» старта ΠΈ остановки Π΄Π²ΠΈΠΆΠΊΠ° PHP
  • Π¦ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса

ΠŸΡ€ΠΈ стартС Π΄Π²ΠΈΠΆΠΊΠ° PHP, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ вызываСтся функция ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ (MINIT) для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ зарСгистрированного модуля. Π­Ρ‚ΠΎ позволяСт ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ рСсурсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ задСйствованы всС врСмя ΠΆΠΈΠ·Π½ΠΈ процСсса Π΄Π²ΠΈΠΆΠΊΠ° PHP. Когда Π΄Π²ΠΈΠΆΠΎΠΊ PHP Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ, ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ остановки ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ (MSHUTDOWN) для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ модуля.

На протяТСнии ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° Π΄Π²ΠΈΠΆΠΊΠ° PHP, ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ количСство запросов. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ запрос ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ». На ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос, Π΄Π²ΠΈΠΆΠΎΠΊ PHP Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ модуля. ΠœΠΎΠ΄ΡƒΠ»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ выставлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ рСсурсов, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… для обслуТивания запроса. По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ ΠΆΠΈΠ·Π½ΠΈ запроса, Π΄Π²ΠΈΠΆΠΎΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ остановки запроса (RSHUTDOWN) для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ модуля, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠΌ произвСсти Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ чистки.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠ»Π°Π³ΠΈΠ½

Плагин mysqlnd Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ пСрСхватывая Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… mysqlnd, ΠΊ mysqlnd. Π­Ρ‚ΠΎ достигаСтся ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ mysqlnd Π½Π° ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ дСмонстрируСт Π·Π°ΠΌΠ΅Π½Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ mysqlnd:

/* Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ */
struct st_mysqlnd_conn_methods org_methods;

void minit_register_hooks(TSRMLS_D) {
  /* активная Ρ‚Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ */
  struct st_mysqlnd_conn_methods * current_methods
    = mysqlnd_conn_get_methods();

  /* бэкап ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ */
  memcpy(&org_methods, current_methods,
    sizeof(struct st_mysqlnd_conn_methods);

  /* установка Π½ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² */
  current_methods->query = MYSQLND_METHOD(my_conn_class, query);
}

ΠœΠ°Π½ΠΈΠΏΡƒΠ»ΡΡ†ΠΈΠ΅ΠΉ с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ соСдинСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π½Π° этапС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ модуля (MINIT). Π’Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ β€” Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ раздСляСмый рСсурс. Π’ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, со сборкой TSRM, манипуляция Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ раздСляСмым рСсурсом Π½Π° этапС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π»ΠΎΠ³ΠΈΠΊΡƒ, которая связана с фиксированным Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΡ€ΠΈ манипуляции с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ mysqlnd. ВсСгда добавляйтС Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² ΠΊΠΎΠ½Π΅Ρ† Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сама Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ.

Π’Ρ‹Π·ΠΎΠ² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

Если записи ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ, остаётся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ β€” Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ.

Π’ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… случаях, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Connection::stmt_init(), ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ сначала Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π² Π½ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅.

MYSQLND_METHOD(my_conn_class, query)(MYSQLND *conn,
  const char *query, unsigned int query_len TSRMLS_DC) {

  php_printf("my_conn_class::query(query = %s)\n", query);

  query = "SELECT 'query rewritten' FROM DUAL";
  query_len = strlen(query);

  return org_methods.query(conn, query, query_len); /* Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ родитСля */
}

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ свойств

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ mysqlnd прСдставлСны ΠΊΠ°ΠΊ C struct. НСвозмоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‡Π»Π΅Π½Π° Π² C struct Π²ΠΎ врСмя исполнСния. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² mysqlnd Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ свойства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (свойства) ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ mysqlnd с использованиСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· сСмСйства mysqlnd_plugin_get_plugin_<object>_data(). ΠŸΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° mysqlnd рСзСрвируСтся мСсто Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для удСрТания void * указатСля Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. mysqlnd Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ мСсто для ΠΎΠ΄Π½ΠΎΠ³ΠΎ void * указатСля Π½Π° ΠΏΠ»Π°Π³ΠΈΠ½.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ указатСля для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π°:

Расчёт указатСля для mysqlnd
АдрСс памяти Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅
0 Начало ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° mysqlnd (C struct)
n ΠšΠΎΠ½Π΅Ρ† ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° mysqlnd (C struct)
n + (m x sizeof(void*)) void* для Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠ»Π°Π³ΠΈΠ½Π° Π½ΠΎΠΌΠ΅Ρ€ m

Если Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ подкласс ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· конструкторов ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° mysqlnd, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹, ΠΈΠΌΠ΅ΠΉΡ‚Π΅ это Π² Π²ΠΈΠ΄Ρƒ!

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ дСмонстрируСт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ свойств:

/* Π›ΡŽΠ±Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ */
typedef struct my_conn_properties {
  unsigned long query_counter;
} MY_CONN_PROPERTIES;

/* ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠ»Π°Π³ΠΈΠ½Π° */
unsigned int my_plugin_id;

void minit_register_hooks(TSRMLS_D) {
  /* ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠ»Π°Π³ΠΈΠ½Π° */
  my_plugin_id = mysqlnd_plugin_register();
  /* snip - see Extending Connection: methods */
}

static MY_CONN_PROPERTIES** get_conn_properties(const MYSQLND *conn TSRMLS_DC) {
  MY_CONN_PROPERTIES** props;
  props = (MY_CONN_PROPERTIES**)mysqlnd_plugin_get_plugin_connection_data(
    conn, my_plugin_id);
  if (!props || !(*props)) {
    *props = mnd_pecalloc(1, sizeof(MY_CONN_PROPERTIES), conn->persistent);
    (*props)->query_counter = 0;
  }
  return props;
}

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ»Π°Π³ΠΈΠ½Π°.

РСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ mysqlnd для Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ»Π°Π³ΠΈΠ½Π°. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅Π½ΡƒΡŽΡ‚ΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π°ΠΊΠΈΠ΅ соглашСния: mnd_*loc(). Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ mysqlnd ΠΈΠΌΠ΅Π΅Ρ‚ ряд ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… свойств, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ использованиС ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ³ΠΎ модуля управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Π½Π΅ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… сборках.

Когда ΠΈ ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ подкласс
Β  Когда ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ подкласс? ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ экзСмпляр ΠΈΠΌΠ΅Π΅Ρ‚ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ? Как ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ подкласс?
Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ (MYSQLND) MINIT НСт mysqlnd_conn_get_methods()
Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ (MYSQLND_RES) MINIT or later Π”Π° mysqlnd_result_get_methods() ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ (MYSQLND_RES_METADATA) MINIT НСт mysqlnd_result_metadata_get_methods()
ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ (MYSQLND_STMT) MINIT НСт mysqlnd_stmt_get_methods()
Π‘Π΅Ρ‚ΡŒ (MYSQLND_NET) MINIT ΠΈΠ»ΠΈ ΠΏΠΎΠ·ΠΆΠ΅ Π”Π° mysqlnd_net_get_methods() ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΎΠ±ΠΌΠ΅Π½Π° (MYSQLND_PROTOCOL) MINIT ΠΈΠ»ΠΈ ΠΏΠΎΠ·ΠΆΠ΅ Π”Π° mysqlnd_protocol_get_methods() ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π’Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ послС MINIT, Ссли это прямо Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π²Ρ‹ΡˆΠ΅.

НСкоторыС классы содСрТат ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ВсС экзСмпляры ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… классов Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ хаоса, особСнно Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ стоит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя MINIT.

ΠŸΡ€ΠΎΡ‡ΠΈΠ΅ классы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠΎΠΏΠΈΠΈ глобально Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ† Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ создаётся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свою Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. Π­Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ Π²Π°ΠΌ Π΄Π²Π΅ возмоТности: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²ΠΎ врСмя MINIT, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ затрагивая Π΄Ρ€ΡƒΠ³ΠΈΠ΅ экзСмпляры этого ΠΆΠ΅ класса.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ раздСляСмой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Бтатус конструктора
Π’ΠΈΠΏ Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅, созданиС, сброс ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ? Π’Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ
Connection (MYSQLND) mysqlnd_init() НСт mysqlnd_connect()
Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ (MYSQLND_RES) Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅:
  • Connection::result_init()
Бброс ΠΈ повторная инициализация Π²ΠΎ врСмя:
  • Result::use_result()
  • Result::store_result
Π”Π°, Π½ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ родитСля!
  • Connection::list_fields()
  • Statement::get_result()
  • Statement::prepare() (Волько ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅)
  • Statement::resultMetaData()
ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π½Π°Π±ΠΎΡ€Π° (MYSQLND_RES_METADATA) Connection::result_meta_init() Π”Π°, Π½ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ родитСля! Result::read_result_metadata()
ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ (MYSQLND_STMT) Connection::stmt_init() Π”Π°, Π½ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ родитСля! Connection::stmt_init()
Π‘Π΅Ρ‚ΡŒ (MYSQLND_NET) mysqlnd_net_init() НСт Connection::init()
ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΎΠ±ΠΌΠ΅Π½Π° (MYSQLND_PROTOCOL) mysqlnd_protocol_init() НСт Connection::init()

ΠΠ°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся Π½Π΅ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ конструктор Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ производят Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для API ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² mysqlnd ΠΈ для Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° mysqlnd. Если Π²Π°ΠΌ Π½Π΅ ΡΡ‚Ρ€Π°ΡˆΠ½Ρ‹ прСдупрСТдСния ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ сильно ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ конструктор, Ρ‚ΠΎ хотя Π±Ρ‹ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ конструктор ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ.

НСсмотря Π½Π° прСдупрСТдСния, это Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ для конструктора подкласса. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ β€” ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ мСсто для измСнСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€, ΡΠ΅Ρ‚ΡŒ, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΎΠ±ΠΌΠ΅Π½Π°.

Бтатус уничтоТСния
Β  ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ? ДСструктор
Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π΄Π°, послС выполнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° free_contents(), end_psession()
Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ Π΄Π°, послС выполнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° free_result()
ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π½Π°Π±ΠΎΡ€Π° Π΄Π°, послС выполнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° free()
ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π΄Π°, послС выполнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° dtor(), free_stmt_content()
Π‘Π΅Ρ‚ΡŒ Π΄Π°, послС выполнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° free()
ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°, послС выполнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° free()

ДСструкторы ΡΠ²Π»ΡΡŽΡ‚ΡΡ подходящим мСстом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ рСсурсы, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡ‹Π΅ свойствами mysqlnd_plugin_get_plugin_<object>_data().

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅ дСструкторы ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ mysqlnd для очистки самого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Однако ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ самым Π»ΡƒΡ‡ΡˆΠΈΠΌ мСстом, ΠΊΡƒΠ΄Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΊΠ»ΠΈΠ½ΠΈΡ‚ΡŒΡΡ для очистки Π΄Π°Π½Π½Ρ‹Ρ… своСго ΠΏΠ»Π°Π³ΠΈΠ½Π°. Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ с конструкторами, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π½Π΅ рСкомСндуСтся. Если Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· пСрСчислСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² очистку Π΄Π°Π½Π½Ρ‹Ρ… своСго ΠΏΠ»Π°Π³ΠΈΠ½Π°, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ запуск Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² mysqlnd.

Для ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ β€” Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ очистки Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΈ сразу послС этого Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄.

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ добавляли примСчания для страницы