这个例子中的
$connection_to_mysql = new AsyncTcpConnection($REAL_MYSQL_ADDRESS);
这个连接对象能不能被缓存呢?让所有链接上来的客户端都使用这个连接对象去访问mysql
use \Workerman\Worker;
use \Workerman\Connection\AsyncTcpConnection;
require_once './Workerman/Autoloader.php';
// 真实的mysql地址,假设这里是本机3306端口
$REAL_MYSQL_ADDRESS = 'tcp://127.0.0.1:3306';
// 代理监听本地4406端口
$proxy = new Worker('tcp://0.0.0.0:4406');
$proxy->onConnect = function($connection)
{
global $REAL_MYSQL_ADDRESS;
// 异步建立一个到实际mysql服务器的连接
$connection_to_mysql = new AsyncTcpConnection($REAL_MYSQL_ADDRESS);
// mysql连接发来数据时,转发给对应客户端的连接
$connection_to_mysql->onMessage = function($connection_to_mysql, $buffer)use($connection)
{
$connection->send($buffer);
};
// mysql连接关闭时,关闭对应的代理到客户端的连接
$connection_to_mysql->onClose = function($connection_to_mysql)use($connection)
{
$connection->close();
};
// mysql连接上发生错误时,关闭对应的代理到客户端的连接
$connection_to_mysql->onError = function($connection_to_mysql)use($connection)
{
$connection->close();
};
// 执行异步连接
$connection_to_mysql->connect();
// 客户端发来数据时,转发给对应的mysql连接
$connection->onMessage = function($connection, $buffer)use($connection_to_mysql)
{
$connection_to_mysql->send($buffer);
};
// 客户端连接断开时,断开对应的mysql连接
$connection->onClose = function($connection)use($connection_to_mysql)
{
$connection_to_mysql->close();
};
// 客户端连接发生错误时,断开对应的mysql连接
$connection->onError = function($connection)use($connection_to_mysql)
{
$connection_to_mysql->close();
};
};
// 运行worker
Worker::runAll();
可以做到。
但是不建议所有客户端都用一个mysql连接,那样会导致所有客户端都要排队去等待这个连接空闲。
就像很多顾客去餐馆吃饭,但是只有一个厨师,如果厨师做菜慢,那么所有顾客都要等待。
多几个厨师一起做菜会更快一些,减少等待。
我是不是可能多打开几个进程去减少等待时间呢?
多开几个进程确实会减少业务等待时间。