1--TEST--
2swoole_server/task: pdo in task and http response detach
3--SKIPIF--
4<?php
5require __DIR__ . '/../../include/skipif.inc';
6skip_if_pdo_not_support_mysql8();
7?>
8--FILE--
9<?php
10require __DIR__ . '/../../include/bootstrap.php';
11Swoole\Runtime::enableCoroutine();
12$pm = new SwooleTest\ProcessManager;
13$pm->parentFunc = function (int $pid) use ($pm) {
14    for ($i = MAX_CONCURRENCY_LOW; $i--;) {
15        go(function () use ($pm) {
16            $ret = httpGetBody("http://127.0.0.1:{$pm->getFreePort()}");
17            Assert::same($ret, 'Hello Swoole!');
18        });
19    }
20    swoole_event_wait();
21    echo "DONE\n";
22    $pm->kill();
23};
24$pm->childFunc = function () use ($pm) {
25    $http = new swoole_http_server('127.0.0.1', $pm->getFreePort(), SERVER_MODE_RANDOM);
26    $http->set([
27        'log_file' => '/dev/null',
28        'task_worker_num' => 4,
29        'task_enable_coroutine' => true
30    ]);
31    $http->on('request', function (swoole_http_request $request, swoole_http_response $response) use ($http) {
32        Assert::assert($response->detach());
33        if (mt_rand(0, 1)) {
34            $http->task($response->fd);
35        } else {
36            $http->task($response->fd, -1, function ($server, $taskId, $data) {
37                list($fd, $data) = $data;
38                $response = swoole_http_response::create($fd);
39                $response->end($data);
40            });
41        }
42    });
43    $http->on('task', function (swoole_http_server $server, swoole_server_task $task) {
44        $fd = $task->data;
45        if (mt_rand(0, 1)) {
46            $task->finish([$fd, 'Hello Swoole!']);
47        } else {
48            $response = swoole_http_response::create($fd);
49            $pdo = new PDO(
50                "mysql:host=" . MYSQL_SERVER_HOST . ";port=" . MYSQL_SERVER_PORT . ";dbname=" . MYSQL_SERVER_DB . ";charset=utf8",
51                MYSQL_SERVER_USER, MYSQL_SERVER_PWD
52            );
53            $stmt = $pdo->query('SELECT "Hello Swoole!"');
54            Assert::assert($stmt->execute());
55            $ret = $stmt->fetchAll(PDO::FETCH_COLUMN)[0];
56            $response->end($ret);
57        }
58    });
59    $http->on('finish', function ($server, $taskId, $data) {
60        list($fd, $ret) = $data;
61        $response = swoole_http_response::create($fd);
62        $response->end($ret);
63    });
64    $http->start();
65};
66$pm->childFirst();
67$pm->run();
68?>
69--EXPECT--
70DONE
71