This source file includes following definitions.
- mysqlnd_minfo_print_hash
- mysqlnd_minfo_dump_plugin_stats
- mysqlnd_minfo_dump_loaded_plugins
- mysqlnd_minfo_dump_api_plugins
- PHP_MINFO_FUNCTION
- ZEND_DECLARE_MODULE_GLOBALS
- PHP_INI_MH
- PHP_INI_BEGIN
- PHP_MSHUTDOWN_FUNCTION
- PHP_RINIT_FUNCTION
- PHP_RSHUTDOWN_FUNCTION
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include "php.h"
23 #include "php_ini.h"
24 #include "mysqlnd.h"
25 #include "mysqlnd_priv.h"
26 #include "mysqlnd_debug.h"
27 #include "mysqlnd_statistics.h"
28 #include "mysqlnd_reverse_api.h"
29 #include "ext/standard/info.h"
30 #include "zend_smart_str.h"
31
32
33
34
35
36 static zend_function_entry mysqlnd_functions[] = {
37 PHP_FE_END
38 };
39
40
41
42
43 PHPAPI void
44 mysqlnd_minfo_print_hash(zval *values)
45 {
46 zval *values_entry;
47 zend_string *string_key;
48
49 ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(values), string_key, values_entry) {
50 convert_to_string(values_entry);
51 php_info_print_table_row(2, ZSTR_VAL(string_key), Z_STRVAL_P(values_entry));
52 } ZEND_HASH_FOREACH_END();
53 }
54
55
56
57
58 static int
59 mysqlnd_minfo_dump_plugin_stats(zval *el, void * argument)
60 {
61 struct st_mysqlnd_plugin_header * plugin_header = (struct st_mysqlnd_plugin_header *)Z_PTR_P(el);
62 if (plugin_header->plugin_stats.values) {
63 char buf[64];
64 zval values;
65 snprintf(buf, sizeof(buf), "%s statistics", plugin_header->plugin_name);
66
67 mysqlnd_fill_stats_hash(plugin_header->plugin_stats.values, plugin_header->plugin_stats.names, &values ZEND_FILE_LINE_CC);
68
69 php_info_print_table_start();
70 php_info_print_table_header(2, buf, "");
71 mysqlnd_minfo_print_hash(&values);
72 php_info_print_table_end();
73 zval_dtor(&values);
74 }
75 return ZEND_HASH_APPLY_KEEP;
76 }
77
78
79
80
81 static int
82 mysqlnd_minfo_dump_loaded_plugins(zval *el, void * buf)
83 {
84 smart_str * buffer = (smart_str *) buf;
85 struct st_mysqlnd_plugin_header * plugin_header = (struct st_mysqlnd_plugin_header *)Z_PTR_P(el);
86 if (plugin_header->plugin_name) {
87 if (buffer->s) {
88 smart_str_appendc(buffer, ',');
89 }
90 smart_str_appends(buffer, plugin_header->plugin_name);
91 }
92 return ZEND_HASH_APPLY_KEEP;
93 }
94
95
96
97
98 static void
99 mysqlnd_minfo_dump_api_plugins(smart_str * buffer)
100 {
101 HashTable *ht = mysqlnd_reverse_api_get_api_list();
102 MYSQLND_REVERSE_API *ext;
103
104 ZEND_HASH_FOREACH_PTR(ht, ext) {
105 if (buffer->s) {
106 smart_str_appendc(buffer, ',');
107 }
108 smart_str_appends(buffer, ext->module->name);
109 } ZEND_HASH_FOREACH_END();
110 }
111
112
113
114
115
116 PHP_MINFO_FUNCTION(mysqlnd)
117 {
118 char buf[32];
119
120 php_info_print_table_start();
121 php_info_print_table_header(2, "mysqlnd", "enabled");
122 php_info_print_table_row(2, "Version", mysqlnd_get_client_info());
123 php_info_print_table_row(2, "Compression",
124 #ifdef MYSQLND_COMPRESSION_ENABLED
125 "supported");
126 #else
127 "not supported");
128 #endif
129 php_info_print_table_row(2, "core SSL",
130 #ifdef MYSQLND_SSL_SUPPORTED
131 "supported");
132 #else
133 "not supported");
134 #endif
135 php_info_print_table_row(2, "extended SSL",
136 #ifdef MYSQLND_HAVE_SSL
137 "supported");
138 #else
139 "not supported");
140 #endif
141 snprintf(buf, sizeof(buf), ZEND_LONG_FMT, MYSQLND_G(net_cmd_buffer_size));
142 php_info_print_table_row(2, "Command buffer size", buf);
143 snprintf(buf, sizeof(buf), ZEND_LONG_FMT, MYSQLND_G(net_read_buffer_size));
144 php_info_print_table_row(2, "Read buffer size", buf);
145 snprintf(buf, sizeof(buf), ZEND_LONG_FMT, MYSQLND_G(net_read_timeout));
146 php_info_print_table_row(2, "Read timeout", buf);
147 php_info_print_table_row(2, "Collecting statistics", MYSQLND_G(collect_statistics)? "Yes":"No");
148 php_info_print_table_row(2, "Collecting memory statistics", MYSQLND_G(collect_memory_statistics)? "Yes":"No");
149
150 php_info_print_table_row(2, "Tracing", MYSQLND_G(debug)? MYSQLND_G(debug):"n/a");
151
152
153 {
154 smart_str tmp_str = {0};
155 mysqlnd_plugin_apply_with_argument(mysqlnd_minfo_dump_loaded_plugins, &tmp_str);
156 smart_str_0(&tmp_str);
157 php_info_print_table_row(2, "Loaded plugins", tmp_str.s? ZSTR_VAL(tmp_str.s) : "");
158 smart_str_free(&tmp_str);
159
160 mysqlnd_minfo_dump_api_plugins(&tmp_str);
161 smart_str_0(&tmp_str);
162 php_info_print_table_row(2, "API Extensions", tmp_str.s? ZSTR_VAL(tmp_str.s) : "");
163 smart_str_free(&tmp_str);
164 }
165
166 php_info_print_table_end();
167
168
169
170 mysqlnd_plugin_apply_with_argument(mysqlnd_minfo_dump_plugin_stats, NULL);
171 }
172
173
174
175 PHPAPI ZEND_DECLARE_MODULE_GLOBALS(mysqlnd)
176
177
178
179
180 static PHP_GINIT_FUNCTION(mysqlnd)
181 {
182 #if defined(COMPILE_DL_MYSQLND) && defined(ZTS)
183 ZEND_TSRMLS_CACHE_UPDATE();
184 #endif
185 mysqlnd_globals->collect_statistics = TRUE;
186 mysqlnd_globals->collect_memory_statistics = FALSE;
187 mysqlnd_globals->debug = NULL;
188 mysqlnd_globals->dbg = NULL;
189 mysqlnd_globals->trace_alloc_settings = NULL;
190 mysqlnd_globals->trace_alloc = NULL;
191 mysqlnd_globals->net_cmd_buffer_size = MYSQLND_NET_CMD_BUFFER_MIN_SIZE;
192 mysqlnd_globals->net_read_buffer_size = 32768;
193 mysqlnd_globals->net_read_timeout = 31536000;
194 mysqlnd_globals->log_mask = 0;
195 mysqlnd_globals->mempool_default_size = 16000;
196 mysqlnd_globals->debug_emalloc_fail_threshold = -1;
197 mysqlnd_globals->debug_ecalloc_fail_threshold = -1;
198 mysqlnd_globals->debug_erealloc_fail_threshold = -1;
199 mysqlnd_globals->debug_malloc_fail_threshold = -1;
200 mysqlnd_globals->debug_calloc_fail_threshold = -1;
201 mysqlnd_globals->debug_realloc_fail_threshold = -1;
202 mysqlnd_globals->sha256_server_public_key = NULL;
203 mysqlnd_globals->fetch_data_copy = FALSE;
204 }
205
206
207
208
209
210 static PHP_INI_MH(OnUpdateNetCmdBufferSize)
211 {
212 zend_long long_value;
213
214 ZEND_ATOL(long_value, ZSTR_VAL(new_value));
215 if (long_value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) {
216 return FAILURE;
217 }
218 MYSQLND_G(net_cmd_buffer_size) = long_value;
219
220 return SUCCESS;
221 }
222
223
224
225
226
227 PHP_INI_BEGIN()
228 STD_PHP_INI_BOOLEAN("mysqlnd.collect_statistics", "1", PHP_INI_ALL, OnUpdateBool, collect_statistics, zend_mysqlnd_globals, mysqlnd_globals)
229 STD_PHP_INI_BOOLEAN("mysqlnd.collect_memory_statistics","0",PHP_INI_SYSTEM, OnUpdateBool, collect_memory_statistics, zend_mysqlnd_globals, mysqlnd_globals)
230 STD_PHP_INI_ENTRY("mysqlnd.debug", NULL, PHP_INI_SYSTEM, OnUpdateString, debug, zend_mysqlnd_globals, mysqlnd_globals)
231 STD_PHP_INI_ENTRY("mysqlnd.trace_alloc", NULL, PHP_INI_SYSTEM, OnUpdateString, trace_alloc_settings, zend_mysqlnd_globals, mysqlnd_globals)
232 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)
233 STD_PHP_INI_ENTRY("mysqlnd.net_read_buffer_size", "32768",PHP_INI_ALL, OnUpdateLong, net_read_buffer_size, zend_mysqlnd_globals, mysqlnd_globals)
234 STD_PHP_INI_ENTRY("mysqlnd.net_read_timeout", "31536000", PHP_INI_SYSTEM, OnUpdateLong, net_read_timeout, zend_mysqlnd_globals, mysqlnd_globals)
235 STD_PHP_INI_ENTRY("mysqlnd.log_mask", "0", PHP_INI_ALL, OnUpdateLong, log_mask, zend_mysqlnd_globals, mysqlnd_globals)
236 STD_PHP_INI_ENTRY("mysqlnd.mempool_default_size","16000", PHP_INI_ALL, OnUpdateLong, mempool_default_size, zend_mysqlnd_globals, mysqlnd_globals)
237 STD_PHP_INI_ENTRY("mysqlnd.sha256_server_public_key",NULL, PHP_INI_PERDIR, OnUpdateString, sha256_server_public_key, zend_mysqlnd_globals, mysqlnd_globals)
238 STD_PHP_INI_BOOLEAN("mysqlnd.fetch_data_copy", "0", PHP_INI_ALL, OnUpdateBool, fetch_data_copy, zend_mysqlnd_globals, mysqlnd_globals)
239 #if PHP_DEBUG
240 STD_PHP_INI_ENTRY("mysqlnd.debug_emalloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_emalloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
241 STD_PHP_INI_ENTRY("mysqlnd.debug_ecalloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_ecalloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
242 STD_PHP_INI_ENTRY("mysqlnd.debug_erealloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_erealloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
243
244 STD_PHP_INI_ENTRY("mysqlnd.debug_malloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_malloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
245 STD_PHP_INI_ENTRY("mysqlnd.debug_calloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_calloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
246 STD_PHP_INI_ENTRY("mysqlnd.debug_realloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_realloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals)
247 #endif
248 PHP_INI_END()
249
250
251
252
253
254 static PHP_MINIT_FUNCTION(mysqlnd)
255 {
256 REGISTER_INI_ENTRIES();
257
258 mysqlnd_library_init();
259 return SUCCESS;
260 }
261
262
263
264
265
266 static PHP_MSHUTDOWN_FUNCTION(mysqlnd)
267 {
268 mysqlnd_library_end();
269
270 UNREGISTER_INI_ENTRIES();
271 return SUCCESS;
272 }
273
274
275
276 #if PHP_DEBUG
277
278
279 static PHP_RINIT_FUNCTION(mysqlnd)
280 {
281 if (MYSQLND_G(debug)) {
282 struct st_mysqlnd_plugin_trace_log * trace_log_plugin = mysqlnd_plugin_find("debug_trace");
283 MYSQLND_G(dbg) = NULL;
284 if (trace_log_plugin) {
285 MYSQLND_DEBUG * dbg = trace_log_plugin->methods.trace_instance_init(mysqlnd_debug_std_no_trace_funcs);
286 MYSQLND_DEBUG * trace_alloc = trace_log_plugin->methods.trace_instance_init(NULL);
287 if (!dbg || !trace_alloc) {
288 return FAILURE;
289 }
290 dbg->m->set_mode(dbg, MYSQLND_G(debug));
291 trace_alloc->m->set_mode(trace_alloc, MYSQLND_G(trace_alloc_settings));
292 MYSQLND_G(dbg) = dbg;
293 MYSQLND_G(trace_alloc) = trace_alloc;
294 }
295 }
296 return SUCCESS;
297 }
298
299 #endif
300
301
302 #if PHP_DEBUG
303
304
305 static PHP_RSHUTDOWN_FUNCTION(mysqlnd)
306 {
307 MYSQLND_DEBUG * dbg = MYSQLND_G(dbg);
308 MYSQLND_DEBUG * trace_alloc = MYSQLND_G(trace_alloc);
309 DBG_ENTER("RSHUTDOWN");
310 if (dbg) {
311 dbg->m->close(dbg);
312 dbg->m->free_handle(dbg);
313 MYSQLND_G(dbg) = NULL;
314 }
315 if (trace_alloc) {
316 trace_alloc->m->close(trace_alloc);
317 trace_alloc->m->free_handle(trace_alloc);
318 MYSQLND_G(trace_alloc) = NULL;
319 }
320 return SUCCESS;
321 }
322
323 #endif
324
325
326 static const zend_module_dep mysqlnd_deps[] = {
327 ZEND_MOD_REQUIRED("standard")
328 ZEND_MOD_END
329 };
330
331
332
333 zend_module_entry mysqlnd_module_entry = {
334 STANDARD_MODULE_HEADER_EX,
335 NULL,
336 mysqlnd_deps,
337 "mysqlnd",
338 mysqlnd_functions,
339 PHP_MINIT(mysqlnd),
340 PHP_MSHUTDOWN(mysqlnd),
341 #if PHP_DEBUG
342 PHP_RINIT(mysqlnd),
343 #else
344 NULL,
345 #endif
346 #if PHP_DEBUG
347 PHP_RSHUTDOWN(mysqlnd),
348 #else
349 NULL,
350 #endif
351 PHP_MINFO(mysqlnd),
352 PHP_MYSQLND_VERSION,
353 PHP_MODULE_GLOBALS(mysqlnd),
354 PHP_GINIT(mysqlnd),
355 NULL,
356 NULL,
357 STANDARD_MODULE_PROPERTIES_EX
358 };
359
360
361
362 #ifdef COMPILE_DL_MYSQLND
363 #ifdef ZTS
364 ZEND_TSRMLS_CACHE_DEFINE()
365 #endif
366 ZEND_GET_MODULE(mysqlnd)
367 #endif
368
369
370
371
372
373
374
375
376
377