服务开启长时间后,第一次请求出现 Mix\Database\Pool\ConnectionPool::borrow(): Send of 5 bytes failed with errno=32 Broken pipe
我是在webman项目中进程开启的时候加载了swoole,并且加载了Mix\Database,访问数据库使用协程没有问题,但是服务开启久了以后再次访问,第一次请求就会出现上述的错误。 请问是我加载的方式不对吗?
namespace bootstrap;
use Mix\Database\Database;
use Swoole\Coroutine;
use Webman\Bootstrap;
class TestBootstrap implements Bootstrap
{
static $db;
public static function start($worker)
{
echo "TestBootstrap start\n";
// 1. 创建连接池
self::$db = new Database('mysql:host=127.0.0.1;port=3306;charset=utf8;dbname=central', 'homestead', 'secret');
// 2. 设置连接池的参数
$maxOpen = 100; // 最大开启连接数
$maxIdle = 20; // 最大闲置连接数
$maxLifetime = 3600; // 连接的最长生命周期
$waitTimeout = 0.0; // 从池获取连接等待的时间, 0为一直等待
self::$db->startPool($maxOpen, $maxIdle, $maxLifetime, $waitTimeout);
\Swoole\Runtime::enableCoroutine(); // 必须放到最后,防止触发协程调度导致异常
}
}
$maxLifetime = 3600; // 连接的最长生命周期
注意这个,要检查和mysql的my.cnf有个配置是连接闲置时间,mysql会自动kill连接,所以 $maxLifetime 要小于那个mysql配置的时间。
$maxLifetime = 3600; // 连接的最长生命周期
注意这个,要检查和mysql的my.cnf有个配置是连接闲置时间,mysql会自动kill连接,所以 $maxLifetime 要小于那个mysql配置的时间。
感谢解答,不过我在MySQL的配置中发现wait_timeout的值是8小时,即28800啊。那么我在程序中设置的最大生存时间3600应该是远小于mysql的wait_timeout的,应该不会报错的。 我现在尝试把wait_timout改为和$maxLifetime一致再试试 这是我修改后的mysql设置:
SHOW VARIABLES LIKE '%timeout%';
connect_timeout 10
delayed_insert_timeout 300
have_statement_timeout YES
innodb_flush_log_at_timeout 1
innodb_lock_wait_timeout 50
innodb_rollback_on_timeout OFF
interactive_timeout 3600
lock_wait_timeout 31536000
net_read_timeout 30
net_write_timeout 60
rpl_stop_slave_timeout 31536000
slave_net_timeout 60
wait_timeout 3600
Send of 5 bytes failed with errno=32 Broken pipe
说明连接已经断开了,并且是mysql server主动断开的
https://www.kancloud.cn/onanying/mixphp2-2/1712317
https://www.kancloud.cn/onanying/mixphp2-2/1712317
感谢老哥,我下午测试的$maxLifetime = interactive_timeout 和wait_timeout依旧会出现错误,我现在试试把$maxLifetime改为3500试试
https://www.kancloud.cn/onanying/mixphp2-2/1712317