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));
 | |
|     }
 | |
| });
 |