php_mysqlnd.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. /*
  2. +----------------------------------------------------------------------+
  3. | Copyright (c) The PHP Group |
  4. +----------------------------------------------------------------------+
  5. | This source file is subject to version 3.01 of the PHP license, |
  6. | that is bundled with this package in the file LICENSE, and is |
  7. | available through the world-wide-web at the following url: |
  8. | https://www.php.net/license/3_01.txt |
  9. | If you did not receive a copy of the PHP license and are unable to |
  10. | obtain it through the world-wide-web, please send a note to |
  11. | license@php.net so we can mail you a copy immediately. |
  12. +----------------------------------------------------------------------+
  13. | Authors: Andrey Hristov <andrey@php.net> |
  14. | Ulf Wendel <uw@php.net> |
  15. +----------------------------------------------------------------------+
  16. */
  17. #include "php.h"
  18. #include "mysqlnd.h"
  19. #include "mysqlnd_priv.h"
  20. #include "mysqlnd_debug.h"
  21. #include "mysqlnd_statistics.h"
  22. #include "mysqlnd_reverse_api.h"
  23. #include "ext/standard/info.h"
  24. #include "zend_smart_str.h"
  25. /* {{{ mysqlnd_minfo_print_hash */
  26. PHPAPI void
  27. mysqlnd_minfo_print_hash(zval *values)
  28. {
  29. zval *values_entry;
  30. zend_string *string_key;
  31. ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(values), string_key, values_entry) {
  32. convert_to_string(values_entry);
  33. php_info_print_table_row(2, ZSTR_VAL(string_key), Z_STRVAL_P(values_entry));
  34. } ZEND_HASH_FOREACH_END();
  35. }
  36. /* }}} */
  37. /* {{{ mysqlnd_minfo_dump_loaded_plugins */
  38. static int
  39. mysqlnd_minfo_dump_loaded_plugins(zval *el, void * buf)
  40. {
  41. smart_str * buffer = (smart_str *) buf;
  42. struct st_mysqlnd_plugin_header * plugin_header = (struct st_mysqlnd_plugin_header *)Z_PTR_P(el);
  43. if (plugin_header->plugin_name) {
  44. if (buffer->s) {
  45. smart_str_appendc(buffer, ',');
  46. }
  47. smart_str_appends(buffer, plugin_header->plugin_name);
  48. }
  49. return ZEND_HASH_APPLY_KEEP;
  50. }
  51. /* }}} */
  52. /* {{{ mysqlnd_minfo_dump_api_plugins */
  53. static void
  54. mysqlnd_minfo_dump_api_plugins(smart_str * buffer)
  55. {
  56. HashTable *ht = mysqlnd_reverse_api_get_api_list();
  57. MYSQLND_REVERSE_API *ext;
  58. ZEND_HASH_FOREACH_PTR(ht, ext) {
  59. if (buffer->s) {
  60. smart_str_appendc(buffer, ',');
  61. }
  62. smart_str_appends(buffer, ext->module->name);
  63. } ZEND_HASH_FOREACH_END();
  64. }
  65. /* }}} */
  66. /* {{{ PHP_MINFO_FUNCTION */
  67. PHP_MINFO_FUNCTION(mysqlnd)
  68. {
  69. char buf[32];
  70. php_info_print_table_start();
  71. php_info_print_table_header(2, "mysqlnd", "enabled");
  72. php_info_print_table_row(2, "Version", mysqlnd_get_client_info());
  73. php_info_print_table_row(2, "Compression",
  74. #ifdef MYSQLND_COMPRESSION_ENABLED
  75. "supported");
  76. #else
  77. "not supported");
  78. #endif
  79. php_info_print_table_row(2, "core SSL",
  80. #ifdef MYSQLND_SSL_SUPPORTED
  81. "supported");
  82. #else
  83. "not supported");
  84. #endif
  85. php_info_print_table_row(2, "extended SSL",
  86. #ifdef MYSQLND_HAVE_SSL
  87. "supported");
  88. #else
  89. "not supported");
  90. #endif
  91. snprintf(buf, sizeof(buf), ZEND_LONG_FMT, MYSQLND_G(net_cmd_buffer_size));
  92. php_info_print_table_row(2, "Command buffer size", buf);
  93. snprintf(buf, sizeof(buf), ZEND_LONG_FMT, MYSQLND_G(net_read_buffer_size));
  94. php_info_print_table_row(2, "Read buffer size", buf);
  95. snprintf(buf, sizeof(buf), ZEND_LONG_FMT, MYSQLND_G(net_read_timeout));
  96. php_info_print_table_row(2, "Read timeout", buf);
  97. php_info_print_table_row(2, "Collecting statistics", MYSQLND_G(collect_statistics)? "Yes":"No");
  98. php_info_print_table_row(2, "Collecting memory statistics", MYSQLND_G(collect_memory_statistics)? "Yes":"No");
  99. php_info_print_table_row(2, "Tracing", MYSQLND_G(debug)? MYSQLND_G(debug):"n/a");
  100. /* loaded plugins */
  101. {
  102. smart_str tmp_str = {0};
  103. mysqlnd_plugin_apply_with_argument(mysqlnd_minfo_dump_loaded_plugins, &tmp_str);
  104. smart_str_0(&tmp_str);
  105. php_info_print_table_row(2, "Loaded plugins", tmp_str.s? ZSTR_VAL(tmp_str.s) : "");
  106. smart_str_free(&tmp_str);
  107. mysqlnd_minfo_dump_api_plugins(&tmp_str);
  108. smart_str_0(&tmp_str);
  109. php_info_print_table_row(2, "API Extensions", tmp_str.s? ZSTR_VAL(tmp_str.s) : "");
  110. smart_str_free(&tmp_str);
  111. }
  112. php_info_print_table_end();
  113. }
  114. /* }}} */
  115. PHPAPI ZEND_DECLARE_MODULE_GLOBALS(mysqlnd)
  116. /* {{{ PHP_GINIT_FUNCTION */
  117. static PHP_GINIT_FUNCTION(mysqlnd)
  118. {
  119. #if defined(COMPILE_DL_MYSQLND) && defined(ZTS)
  120. ZEND_TSRMLS_CACHE_UPDATE();
  121. #endif
  122. mysqlnd_globals->collect_statistics = TRUE;
  123. mysqlnd_globals->collect_memory_statistics = FALSE;
  124. mysqlnd_globals->debug = NULL; /* The actual string */
  125. mysqlnd_globals->dbg = NULL; /* The DBG object*/
  126. mysqlnd_globals->trace_alloc_settings = NULL;
  127. mysqlnd_globals->trace_alloc = NULL;
  128. mysqlnd_globals->net_cmd_buffer_size = MYSQLND_NET_CMD_BUFFER_MIN_SIZE;
  129. mysqlnd_globals->net_read_buffer_size = 32768;
  130. mysqlnd_globals->net_read_timeout = 31536000;
  131. mysqlnd_globals->log_mask = 0;
  132. mysqlnd_globals->mempool_default_size = 16000;
  133. mysqlnd_globals->sha256_server_public_key = NULL;
  134. }
  135. /* }}} */
  136. /* {{{ PHP_INI_MH */
  137. static PHP_INI_MH(OnUpdateNetCmdBufferSize)
  138. {
  139. zend_long long_value = ZEND_ATOL(ZSTR_VAL(new_value));
  140. if (long_value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) {
  141. return FAILURE;
  142. }
  143. MYSQLND_G(net_cmd_buffer_size) = long_value;
  144. return SUCCESS;
  145. }
  146. /* }}} */
  147. /* {{{ PHP_INI_BEGIN */
  148. PHP_INI_BEGIN()
  149. STD_PHP_INI_BOOLEAN("mysqlnd.collect_statistics", "1", PHP_INI_ALL, OnUpdateBool, collect_statistics, zend_mysqlnd_globals, mysqlnd_globals)
  150. STD_PHP_INI_BOOLEAN("mysqlnd.collect_memory_statistics","0",PHP_INI_SYSTEM, OnUpdateBool, collect_memory_statistics, zend_mysqlnd_globals, mysqlnd_globals)
  151. STD_PHP_INI_ENTRY("mysqlnd.debug", NULL, PHP_INI_SYSTEM, OnUpdateString, debug, zend_mysqlnd_globals, mysqlnd_globals)
  152. STD_PHP_INI_ENTRY("mysqlnd.trace_alloc", NULL, PHP_INI_SYSTEM, OnUpdateString, trace_alloc_settings, zend_mysqlnd_globals, mysqlnd_globals)
  153. STD_PHP_INI_ENTRY("mysqlnd.net_cmd_buffer_size", MYSQLND_NET_CMD_BUFFER_MIN_SIZE_STR, PHP_INI_ALL, OnUpdateNetCmdBufferSize, net_cmd_buffer_size, zend_mysqlnd_globals, mysqlnd_globals)
  154. STD_PHP_INI_ENTRY("mysqlnd.net_read_buffer_size", "32768",PHP_INI_ALL, OnUpdateLong, net_read_buffer_size, zend_mysqlnd_globals, mysqlnd_globals)
  155. STD_PHP_INI_ENTRY("mysqlnd.net_read_timeout", "86400",PHP_INI_ALL, OnUpdateLong, net_read_timeout, zend_mysqlnd_globals, mysqlnd_globals)
  156. STD_PHP_INI_ENTRY("mysqlnd.log_mask", "0", PHP_INI_ALL, OnUpdateLong, log_mask, zend_mysqlnd_globals, mysqlnd_globals)
  157. STD_PHP_INI_ENTRY("mysqlnd.mempool_default_size","16000", PHP_INI_ALL, OnUpdateLong, mempool_default_size, zend_mysqlnd_globals, mysqlnd_globals)
  158. STD_PHP_INI_ENTRY("mysqlnd.sha256_server_public_key",NULL, PHP_INI_PERDIR, OnUpdateString, sha256_server_public_key, zend_mysqlnd_globals, mysqlnd_globals)
  159. PHP_INI_END()
  160. /* }}} */
  161. /* {{{ PHP_MINIT_FUNCTION */
  162. static PHP_MINIT_FUNCTION(mysqlnd)
  163. {
  164. REGISTER_INI_ENTRIES();
  165. mysqlnd_library_init();
  166. return SUCCESS;
  167. }
  168. /* }}} */
  169. /* {{{ PHP_MSHUTDOWN_FUNCTION */
  170. static PHP_MSHUTDOWN_FUNCTION(mysqlnd)
  171. {
  172. mysqlnd_library_end();
  173. UNREGISTER_INI_ENTRIES();
  174. return SUCCESS;
  175. }
  176. /* }}} */
  177. #if PHP_DEBUG
  178. /* {{{ PHP_RINIT_FUNCTION */
  179. static PHP_RINIT_FUNCTION(mysqlnd)
  180. {
  181. if (MYSQLND_G(debug)) {
  182. struct st_mysqlnd_plugin_trace_log * trace_log_plugin = mysqlnd_plugin_find("debug_trace");
  183. MYSQLND_G(dbg) = NULL;
  184. if (trace_log_plugin) {
  185. MYSQLND_DEBUG * dbg = trace_log_plugin->methods.trace_instance_init(mysqlnd_debug_std_no_trace_funcs);
  186. MYSQLND_DEBUG * trace_alloc = trace_log_plugin->methods.trace_instance_init(NULL);
  187. if (!dbg || !trace_alloc) {
  188. return FAILURE;
  189. }
  190. dbg->m->set_mode(dbg, MYSQLND_G(debug));
  191. trace_alloc->m->set_mode(trace_alloc, MYSQLND_G(trace_alloc_settings));
  192. MYSQLND_G(dbg) = dbg;
  193. MYSQLND_G(trace_alloc) = trace_alloc;
  194. }
  195. }
  196. return SUCCESS;
  197. }
  198. /* }}} */
  199. #endif
  200. #if PHP_DEBUG
  201. /* {{{ PHP_RSHUTDOWN_FUNCTION */
  202. static PHP_RSHUTDOWN_FUNCTION(mysqlnd)
  203. {
  204. MYSQLND_DEBUG * dbg = MYSQLND_G(dbg);
  205. MYSQLND_DEBUG * trace_alloc = MYSQLND_G(trace_alloc);
  206. DBG_ENTER("RSHUTDOWN");
  207. if (dbg) {
  208. dbg->m->close(dbg);
  209. dbg->m->free_handle(dbg);
  210. MYSQLND_G(dbg) = NULL;
  211. }
  212. if (trace_alloc) {
  213. trace_alloc->m->close(trace_alloc);
  214. trace_alloc->m->free_handle(trace_alloc);
  215. MYSQLND_G(trace_alloc) = NULL;
  216. }
  217. return SUCCESS;
  218. }
  219. /* }}} */
  220. #endif
  221. static const zend_module_dep mysqlnd_deps[] = {
  222. ZEND_MOD_REQUIRED("standard")
  223. ZEND_MOD_END
  224. };
  225. /* {{{ mysqlnd_module_entry */
  226. zend_module_entry mysqlnd_module_entry = {
  227. STANDARD_MODULE_HEADER_EX,
  228. NULL,
  229. mysqlnd_deps,
  230. "mysqlnd",
  231. NULL,
  232. PHP_MINIT(mysqlnd),
  233. PHP_MSHUTDOWN(mysqlnd),
  234. #if PHP_DEBUG
  235. PHP_RINIT(mysqlnd),
  236. #else
  237. NULL,
  238. #endif
  239. #if PHP_DEBUG
  240. PHP_RSHUTDOWN(mysqlnd),
  241. #else
  242. NULL,
  243. #endif
  244. PHP_MINFO(mysqlnd),
  245. PHP_MYSQLND_VERSION,
  246. PHP_MODULE_GLOBALS(mysqlnd),
  247. PHP_GINIT(mysqlnd),
  248. NULL,
  249. NULL,
  250. STANDARD_MODULE_PROPERTIES_EX
  251. };
  252. /* }}} */
  253. /* {{{ COMPILE_DL_MYSQLND */
  254. #ifdef COMPILE_DL_MYSQLND
  255. #ifdef ZTS
  256. ZEND_TSRMLS_CACHE_DEFINE()
  257. #endif
  258. ZEND_GET_MODULE(mysqlnd)
  259. #endif
  260. /* }}} */