Annotation of embedaddon/php/ext/mysqli/tests/mysqli_fetch_array_large.phpt, revision 1.1.1.2
1.1 misho 1: --TEST--
2: mysqli_fetch_array() - large packages (to test compression)
3: --SKIPIF--
4: <?php
5: require_once('skipif.inc');
6: require_once('skipifconnectfailure.inc');
7: ?>
1.1.1.2 ! misho 8: --INI--
! 9: memory_limit=-1
1.1 misho 10: --FILE--
11: <?php
12: require_once("connect.inc");
13:
14: function mysqli_fetch_array_large($offset, $link, $package_size) {
15:
16: /* we are aiming for maximum compression to test MYSQLI_CLIENT_COMPRESS */
17: $random_char = str_repeat('a', 255);
18: $sql = "INSERT INTO test(label) VALUES ";
19:
20: while (strlen($sql) < ($package_size - 259))
21: $sql .= sprintf("('%s'), ", $random_char);
22:
23: $sql = substr($sql, 0, -2);
24: $len = strlen($sql);
25: assert($len < $package_size);
26:
27: if (!@mysqli_query($link, $sql)) {
28: if (1153 == mysqli_errno($link) || 2006 == mysqli_errno($link) || stristr(mysqli_error($link), 'max_allowed_packet'))
29: /*
30: myslqnd - [1153] Got a packet bigger than 'max_allowed_packet' bytes
31: libmysql -[2006] MySQL server has gone away
32: */
33: return false;
34:
35: printf("[%03d + 1] len = %d, [%d] %s\n", $offset, $len, mysqli_errno($link), mysqli_error($link));
36: return false;
37: }
38:
39: /* buffered result set - let's hope we do not run into PHP memory limit... */
40: if (!$res = mysqli_query($link, "SELECT id, label FROM test")) {
41: printf("[%03d + 2] len = %d, [%d] %s\n", $offset, $len, mysqli_errno($link), mysqli_error($link));
42: return false;
43: }
44:
45: while ($row = mysqli_fetch_assoc($res)) {
46: if ($row['label'] != $random_char) {
47: printf("[%03d + 3] Wrong results - expecting '%s' got '%s', len = %d, [%d] %s\n",
48: $offset, $random_char, $row['label'], $len, mysqli_errno($link), mysqli_error($link));
49: return false;
50: }
51: }
52: mysqli_free_result($res);
53:
54: if (!$stmt = mysqli_prepare($link, "SELECT id, label FROM test")) {
55: printf("[%03d + 4] len = %d, [%d] %s\n", $offset, $len, mysqli_errno($link), mysqli_error($link));
56: return false;
57: }
58:
59: /* unbuffered result set */
60: if (!mysqli_stmt_execute($stmt)) {
61: printf("[%03d + 5] len = %d, [%d] %s, [%d] %s\n", $offset, $len, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt), mysqli_errno($link), mysqli_error($link));
62: return false;
63: }
64:
65: $id = $label = NULL;
66: if (!mysqli_stmt_bind_result($stmt, $id, $label)) {
67: printf("[%03d + 6] len = %d, [%d] %s, [%d] %s\n", $offset, $len, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt), mysqli_errno($link), mysqli_error($link));
68: return false;
69: }
70:
71: while (mysqli_stmt_fetch($stmt)) {
72: if ($label != $random_char) {
73: printf("[%03d + 7] Wrong results - expecting '%s' got '%s', len = %d, [%d] %s\n",
74: $offset, $random_char, $label, $len, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
75: return false;
76: }
77: }
78:
79: mysqli_stmt_free_result($stmt);
80: mysqli_stmt_close($stmt);
81:
82: return true;
83: }
84:
85: function parse_memory_limit($limit) {
86:
87: $val = trim($limit);
88: $last = strtolower($val[strlen($val)-1]);
89:
90: switch($last) {
91: // The 'G' modifier is available since PHP 5.1.0
92: case 'g':
93: $val *= 1024;
94: case 'm':
95: $val *= 1024;
96: case 'k':
97: $val *= 1024;
98: default:
99: break;
100: }
101: return $val;
102: }
103:
104:
105: function test_fetch($host, $user, $passwd, $db, $port, $socket, $engine, $flags = null) {
106:
107: $link = mysqli_init();
108: if (!my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags)) {
109: printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
110: $host, $user, $db, $port, $socket);
111: return false;
112: }
113:
114: if (!mysqli_query($link, "DROP TABLE IF EXISTS test") ||
115: !mysqli_query($link, sprintf("CREATE TABLE test(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, label VARCHAR(255)) ENGINE = %s", $engine))) {
116: printf("[002] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
117: return false;
118: }
119:
120: $package_size = 524288;
121: $offset = 3;
122: $limit = (ini_get('memory_limit') > 0) ? parse_memory_limit(ini_get('memory_limit')) : pow(2, 32);
123:
124: /* try to respect php.ini but make run time a soft limit */
125: $max_runtime = (ini_get('max_execution_time') > 0) ? ini_get('max_execution_time') : 30;
126: set_time_limit(0);
127:
128: do {
129: if ($package_size > $limit) {
130: printf("stop: memory limit - %s vs. %s\n", $package_size, $limit);
131: break;
132: }
133:
134: $start = microtime(true);
135: if (!mysqli_fetch_array_large($offset++, $link, $package_size)) {
136: printf("stop: packet size - %d\n", $package_size);
137: break;
138: }
139:
140: $duration = microtime(true) - $start;
141: $max_runtime -= $duration;
142: if ($max_runtime < ($duration * 3)) {
143: /* likely the next iteration will not be within max_execution_time */
144: printf("stop: time limit - %2.2fs\n", $max_runtime);
145: break;
146: }
147:
148: $package_size += $package_size;
149:
150: } while (true);
151:
152:
153: mysqli_close($link);
154: return true;
155: }
156:
157:
158: test_fetch($host, $user, $passwd, $db, $port, $socket, $engine, null);
159: test_fetch($host, $user, $passwd, $db, $port, $socket, $engine, MYSQLI_CLIENT_COMPRESS);
160: print "done!";
161: ?>
162: --CLEAN--
163: <?php
164: require_once("clean_table.inc");
165: ?>
166: --EXPECTF--
167: stop: %s
168: stop: %s
1.1.1.2 ! misho 169: done!
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>