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