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>