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