Annotation of embedaddon/php/ext/mysqli/tests/mysqli_fork.phpt, revision 1.1.1.1
1.1 misho 1: --TEST--
2: Forking a child and using the same connection.
3: --SKIPIF--
4: <?php
5: require_once('skipif.inc');
6: require_once('skipifemb.inc');
7: require_once('skipifconnectfailure.inc');
8:
9: if (!function_exists('pcntl_fork'))
10: die("skip Process Control Functions not available");
11:
12: if (!function_exists('posix_getpid'))
13: die("skip POSIX functions not available");
14:
15: require_once('connect.inc');
16: if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
17: die(sprintf("Cannot connect, [%d] %s", mysqli_connect_errno(), mysqli_connect_error()));
18:
19: if (!have_innodb($link))
20: die(sprintf("Needs InnoDB support, [%d] %s", $link->errno, $link->error));
21: ?>
22: --FILE--
23: <?php
24: require_once("table.inc");
25:
26: $res = mysqli_query($link, "SELECT 'dumped by the parent' AS message");
27: $pid = pcntl_fork();
28: switch ($pid) {
29: case -1:
30: printf("[001] Cannot fork child");
31: break;
32:
33: case 0:
34: /* child */
35: exit(0);
36: break;
37:
38: default:
39: /* parent */
40: $status = null;
41: $wait_id = pcntl_waitpid($pid, $status);
42: if (pcntl_wifexited($status) && (0 != ($tmp = pcntl_wexitstatus($status)))) {
43: printf("Exit code: %s\n", (pcntl_wifexited($status)) ? pcntl_wexitstatus($status) : 'n/a');
44: printf("Signal: %s\n", (pcntl_wifsignaled($status)) ? pcntl_wtermsig($status) : 'n/a');
45: printf("Stopped: %d\n", (pcntl_wifstopped($status)) ? pcntl_wstopsig($status) : 'n/a');
46: }
47: var_dump(mysqli_fetch_assoc($res));
48: mysqli_free_result($res);
49: break;
50: }
51:
52: if (@mysqli_query($link, "SELECT id FROM test WHERE id = 1"))
53: printf("[003] Expecting error and closed connection, child exit should have closed connection\n");
54: else if ((($errno = mysqli_errno($link)) == 0) || ('' == ($error = mysqli_error($link))))
55: printf("[004] Expecting error string and error code from MySQL, got errno = %s/%s, error = %s/%s\n",
56: gettype($errno), $errno, gettype($error), $error);
57:
58: mysqli_close($link);
59: if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
60: printf("[005] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
61: $host, $user, $db, $port, $socket);
62:
63: /* non trivial tests require a message list for parent-child communication */
64: if (!mysqli_query($link, "DROP TABLE IF EXISTS messages"))
65: printf("[006] [%d] %s\n", mysqli_error($link), mysqli_errno($link));
66:
67: if (!mysqli_query($link, "CREATE TABLE messages(
68: msg_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
69: msg_time TIMESTAMP,
70: pid INT NOT NULL,
71: sender ENUM('child', 'parent') NOT NULL,
72: msg TEXT) ENGINE = InnoDB"))
73: printf("[007] [%d] %s\n", mysqli_error($link), mysqli_errno($link));
74:
75: mysqli_autocommit($link, false);
76: if (!$res = mysqli_query($link, "SELECT id, label FROM test ORDER BY id ASC LIMIT 3", MYSQLI_USE_RESULT))
77: printf("[008] [%d] %s\n", mysqli_error($link), mysqli_errno($link));
78:
79: $pid = pcntl_fork();
80:
81: switch ($pid) {
82: case -1:
83: printf("[009] Cannot fork child");
84: break;
85:
86: case 0:
87: /* child */
88: if (!($plink = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) || !mysqli_autocommit($plink, true))
89: exit(mysqli_errno($plink));
90:
91: $sql = sprintf("INSERT INTO messages(pid, sender, msg) VALUES (%d, 'child', '%%s')", posix_getpid());
92: if (!mysqli_query($plink, sprintf($sql, 'start')))
93: exit(mysqli_errno($plink));
94:
95: $parent_sql = sprintf("SELECT msg_id, msg_time, msg FROM messages WHERE pid = %d AND sender = 'parent' ORDER BY msg_id DESC LIMIT 1", posix_getppid());
96: $msg_id = 0;
97: while ($row = mysqli_fetch_assoc($res)) {
98: /* send row to parent */
99: ob_start();
100: var_dump($row);
101: $tmp = ob_get_contents();
102: ob_end_clean();
103: if (!mysqli_query($plink, sprintf($sql, $tmp)))
104: exit(mysqli_errno($plink));
105:
106: /* let the parent reply... */
107: $start = time();
108: do {
109: usleep(100);
110: if (!$pres = mysqli_query($plink, $parent_sql))
111: continue;
112: $tmp = mysqli_fetch_assoc($pres);
113: mysqli_free_result($pres);
114: if ($tmp['msg_id'] == $msg_id)
115: /* no new message */
116: continue;
117: if ($tmp['msg'] == 'stop')
118: break 2;
119: $msg_id = $tmp['msg_id'];
120: break;
121: } while ((time() - $start) < 5);
122:
123: }
124:
125: if (!mysqli_query($plink, sprintf($sql, 'stop')) || !mysqli_commit($link))
126: exit(mysqli_errno($plink));
127: exit(0);
128: break;
129:
130: default:
131: /* parent */
132: if (!$plink = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
133: printf("[010] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
134: $host, $user, $db, $port, $socket);
135:
136: $status = null;
137: $start = time();
138: $sql = sprintf("SELECT msg_id, msg_time, msg FROM messages WHERE pid = %d AND sender = 'child' ORDER BY msg_id DESC LIMIT 1", $pid);
139: $parent_sql = sprintf("INSERT INTO messages (pid, sender, msg) VALUES (%d, 'parent', '%%s')", posix_getpid());
140: $last_msg_id = 0;
141: $num_rows = 0;
142: do {
143: $wait_id = pcntl_waitpid($pid, $status, WNOHANG);
144: if ($pres = mysqli_query($plink, $sql)) {
145: $row = mysqli_fetch_assoc($pres);
146: if ($row['msg_id'] != $last_msg_id) {
147: $last_msg_id = $row['msg_id'];
148: switch ($row['msg']) {
149: case 'start':
150: break;
151: case 'stop':
152: break 2;
153: default:
154: /* client has started fetching rows */
155: $client_row = $row['msg'];
156:
157: $num_rows++;
158: if ($num_rows > 3) {
159: printf("[011] Child has fetched more than three rows!\n");
160: var_dump($client_row);
161: if (!mysqli_query($plink, sprintf($parent_sql, 'stop'))) {
162: printf("[012] Parent cannot inform child\n", mysqli_errno($plink), mysqli_error($plink));
163: }
164: break 2;
165: }
166:
167: if (!$parent_row = mysqli_fetch_assoc($res)) {
168: printf("[013] Parent cannot fetch row %d\n", $num_rows, mysqli_errno($link), mysqli_error($link));
169: if (!mysqli_query($plink, sprintf($parent_sql, 'stop'))) {
170: printf("[014] Parent cannot inform child\n", mysqli_errno($plink), mysqli_error($plink));
171: }
172: break 2;
173: }
174:
175: ob_start();
176: var_dump($parent_row);
177: $parent_row = ob_get_contents();
178: ob_end_clean();
179:
180: if ($parent_row != $client_row) {
181: printf("[015] Child indicates different results than parent.\n");
182: var_dump($child_row);
183: var_dump($parent_row);
184: if (!mysqli_query($plink, sprintf($parent_sql, 'stop'))) {
185: printf("[016] Parent cannot inform child\n", mysqli_errno($plink), mysqli_error($plink));
186: }
187: break 2;
188: }
189:
190: if (!mysqli_query($plink, sprintf($parent_sql, 'continue'))) {
191: printf("[017] Parent cannot inform child to continue.\n", mysqli_errno($plink), mysqli_error($plink));
192: }
193: break;
194: }
195: }
196: mysqli_free_result($pres);
197: }
198: usleep(100);
199: } while (((time() - $start) < 5) && ($num_rows < 3));
200: mysqli_close($plink);
201: $wait_id = pcntl_waitpid($pid, $status);
202: if (pcntl_wifexited($status) && (0 != ($tmp = pcntl_wexitstatus($status)))) {
203: printf("Exit code: %s\n", (pcntl_wifexited($status)) ? pcntl_wexitstatus($status) : 'n/a');
204: printf("Signal: %s\n", (pcntl_wifsignaled($status)) ? pcntl_wtermsig($status) : 'n/a');
205: printf("Stopped: %d\n", (pcntl_wifstopped($status)) ? pcntl_wstopsig($status) : 'n/a');
206: }
207: break;
208: }
209: mysqli_free_result($res);
210: mysqli_close($link);
211:
212: if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
213: printf("[018] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
214: $host, $user, $db, $port, $socket);
215:
216: if (!$res = mysqli_query($link, "SELECT sender, msg FROM messages ORDER BY msg_id ASC"))
217: printf("[019] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
218:
219: while ($row = mysqli_fetch_assoc($res))
220: printf("%10s %s\n", $row['sender'], substr($row['msg'], 0, 5));
221: mysqli_free_result($res);
222:
223: print "done!";
224: ?>
225: --CLEAN--
226: <?php
227: require_once("connect.inc");
228: if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
229: printf("[c001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
230:
231: if (!mysqli_query($link, "DROP TABLE IF EXISTS test"))
232: printf("[c002] Cannot drop table, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
233:
234: if (!mysqli_query($link, "DROP TABLE IF EXISTS messages"))
235: printf("[c003] Cannot drop table, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
236:
237: mysqli_close($link);
238: ?>
239: --EXPECTF--
240: array(1) {
241: ["message"]=>
242: string(20) "dumped by the parent"
243: }
244: child start
245: child array
246: parent conti
247: child array
248: parent conti
249: child array
250: parent conti
251: child stop
252: done!
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>