PHP code example of sue / async-mysql
1. Go to this page and download the library: Download sue/async-mysql library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
sue / async-mysql example snippets
use Illuminate\Support\Facades\DB;
use function Sue\EventLoop\loop;
use function Sue\Coroutine\co;
co(function () {
$connection = DB::connection('async-mysql');
//以下3条SQL将并行执行
$users = yield [
$connection->table('users')->where('name', 'foo')->first(),
$connection->table('users')->where('name', 'bar')->first(),
$connection->table('users')->where('name', 'baz')->first()
];
echo $users[0]->name; //expected value is 'foo'
echo $users[1]->name; //expected value is 'bar'
echo $users[2]->name; //expected value is 'baz'
});
[
'driver' => 'async-mysql',
'write' => [
'host' => ['localhost1', 'localhost2'],
'username' => 'root',
'password' => 'root',
/** 可选配置
OptionConst::NUM_CONNECTIONS => 5, //配置链接数为5
*/
],
'read' => [
'host' => ['localhost1', 'localhost2'],
'username' => 'root',
'password' => 'root',
/** 可选配置
OptionConst::NUM_CONNECTIONS => 10, //配置连接数为5
*/
],
/**
* 可选配置
OptionConst::MAX_RUNNING_SECONDS => 30, //SQL最大运行时间
OptionConst::IDLE_TIMEOUT => 30, //连接被回收前闲置的最大时间限制
OptionConst::WAITING_LIST_SIZE => 1000, //待执行SQL的等待列表大小
**/
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'strict' => true,
'engine' => null
];
use Illuminate\Support\Facades\DB;
use function Sue\EventLoop\loop();
DB::connection('async-mysql')
->table('users')
->where('username', 'foo')
->first()
->then(function ($user) {
echo "User " . $user->username . "\n";
}, function ($error) {
echo $error . "\n";
});
loop()->run();
$db = new \Illuminate\Database\Capsule\Manager;
$db->addConnection([
'driver' => 'async-mysql',
'write' => [
'host' => ['localhost'],
'username' => 'root',
'password' => 'root',
/** 可选配置
OptionConst::NUM_CONNECTIONS => 5, //配置链接数为5
*/
],
'read' => [
'host' => ['localhost'],
'username' => 'root',
'password' => 'root',
/** 可选配置
OptionConst::NUM_CONNECTIONS => 10, //配置连接数为5
*/
],
/**
* 可选配置
OptionConst::MAX_RUNNING_SECONDS => 30, //SQL最大运行时间
OptionConst::IDLE_TIMEOUT => 30, //连接被回收前闲置的最大时间限制
OptionConst::WAITING_LIST_SIZE => 1000, //待执行SQL的等待列表大小
**/
'port' => 3306,
'database' => 'main',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'strict' => true,
'engine' => null
], 'async-mysql');
$manager = $db->getDatabaseManager();
$logger = new PsrLogger(); //这里可以初始化一个 \Psr\Log\LoggerInterface的实例,没有的话传null
$manager->extend('async-mysql', function ($config, $name, $logger) {
$config['name'] = $name;
return new Connection($config, $logger);
});
$db->setAsGlobal(); //设置全局可用
use Illuminate\Database\Capsule\Manager as DB;
use Sue\EventLoop\loop;
DB::connection('async-mysql')
->table('users')
->where('username', 'foo')
->first()
->then(function ($user) {
echo "User " . $user->username . "\n";
}, function ($error) {
echo $error . "\n";
});
loop()->run();
use function Sue\Coroutine\co;
use function Sue\EventLoop\loop;
co(function () {
$connection = DB::connection('async-mysql')
$transaction = yield $connection->beginTransaction();
try {
$num_updated = yield $connection->table('users')
->setTransaction($transaction)
->where('name', 'foo')
->update(['age' => 18]);
$bool = yield $connection->commit($transaction);
} catch (Exception $e) {
echo "some error: " . $e . "\n";
yield $connection->rollback($transaction);
}
});
loop()->run();
DB::connection('async-mysql')
->table('users')
->setUseWrite() //强制读主库
->where('name', 'foo')
->first()
->then(function ($user) {
echo "name: " . $user->name;
}, function ($error) {
echo $error;
});
loop()->run();
use Sue\Async\Mysql\OptionConst;
$config = [
'async-mysql' => [
'driver' => 'async-mysql',
'read' => [],
'write' => [],
'port' => 3306,
OptionConst::MAX_RUNNING_SECONDS => 30, //最多运行30秒
]
];
use React\Promise\Timer\TimeoutException;
DB::connection('async-mysql')
->table('users')
->setTimeout(3) //超时时间3秒
->selectRaw('SLEEP(5)') //让mysql sleep5秒后再返回结果
->first()
->then(function ($user) {
//wont be here
}, function (TimeoutException $e) {
echo "timeout exception";
});
use Sue\Async\Mysql\Query\QueryOption;
use function Sue\EventLoop\loop;
use function Sue\Coroutine\co;
//设置超时时间
$option = new QueryOption();
$option->setTimeout(2); //设置SQL 2秒超时
DB::connection('async-mysql')->unprepared("select * from users", $option);
//设置强制读主
$option = new QueryOption();
$option->setUseWrite();
DB::connection('async-mysql')->unprepared("select * from users", $option);
//设置事务
co(function () {
$connection = DB::connection('async-mysql');
$transaction = yield $connection->startTransaction();
$option = new QueryOption();
$option->setTransaction($transaction);
$connection->unprepared("select * from users", $option);
yield $connection->commit($transaction);
});
loop()->run();
$connection = DB::connection('async-mysql');
$seconds_delay = 3;
$connection->setPipeRecycleDebounceSeconds($seconds_delay);
//SQL完成后防抖3秒后尝试回收闲置时间超过IDLE_TIMEOUT的处于idle状态的连接
$connection = DB::connection('async-mysql');
$seconds_delay = 3;
$connection->setPipePingDebounceSeconds($seconds_delay);
//SQL请求时防抖3秒后尝试ping所有非关闭的连接,如果ping失败的话会尝试关闭处于idle状态的连接