66 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			66 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | include '../vendor/autoload.php'; | ||
|  | 
 | ||
|  | use Smf\ConnectionPool\ConnectionPool; | ||
|  | use Smf\ConnectionPool\Connectors\PDOConnector; | ||
|  | use Swoole\Coroutine; | ||
|  | 
 | ||
|  | Swoole\Runtime::enableCoroutine(); | ||
|  | 
 | ||
|  | go(function () { | ||
|  |     // All MySQL connections: [10, 30]
 | ||
|  |     $pool = new ConnectionPool( | ||
|  |         [ | ||
|  |             'minActive'         => 10, | ||
|  |             'maxActive'         => 30, | ||
|  |             'maxWaitTime'       => 5, | ||
|  |             'maxIdleTime'       => 20, | ||
|  |             'idleCheckInterval' => 10, | ||
|  |         ], | ||
|  |         new PDOConnector, | ||
|  |         [ | ||
|  |             'dsn'      => 'mysql:host=127.0.0.1;port=3306;dbname=mysql;charset=utf8mb4', | ||
|  |             'username' => 'root', | ||
|  |             'password' => 'xy123456', | ||
|  |             'options'  => [ | ||
|  |                 \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION, | ||
|  |                 \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, | ||
|  |                 \PDO::ATTR_TIMEOUT            => 30, | ||
|  |             ], | ||
|  |         ] | ||
|  |     ); | ||
|  |     $pool->init(); | ||
|  | 
 | ||
|  |     // For debug
 | ||
|  |     $peakCount = 0; | ||
|  |     swoole_timer_tick(1000, function () use ($pool, &$peakCount) { | ||
|  |         $count = $pool->getConnectionCount(); | ||
|  |         $idleCount = $pool->getIdleCount(); | ||
|  |         if ($peakCount < $count) { | ||
|  |             $peakCount = $count; | ||
|  |         } | ||
|  |         echo "Pool connection count: $count, peak count: $peakCount, idle count: $idleCount\n"; | ||
|  |     }); | ||
|  | 
 | ||
|  |     while (true) { | ||
|  |         $count = mt_rand(1, 45); | ||
|  |         echo "Query count: $count\n"; | ||
|  |         for ($i = 0; $i < $count; $i++) { | ||
|  |             go(function () use ($pool) { | ||
|  |                 /**@var \PDO $pdo */ | ||
|  |                 $pdo = $pool->borrow(); | ||
|  |                 defer(function () use ($pool, $pdo) { | ||
|  |                     $pool->return($pdo); | ||
|  |                 }); | ||
|  |                 $statement = $pdo->query('show status like \'Threads_connected\''); | ||
|  |                 $ret = $statement->fetch(); | ||
|  |                 if (!isset($ret['Variable_name'])) { | ||
|  |                     echo "Invalid query result: \n", print_r($ret, true); | ||
|  |                 } | ||
|  |                 echo $ret['Variable_name'] . ': ' . $ret['Value'] . "\n"; | ||
|  |             }); | ||
|  |         } | ||
|  |         Coroutine::sleep(mt_rand(1, 15)); | ||
|  |     } | ||
|  | }); |