database icon indicating copy to clipboard operation
database copied to clipboard

服务开启长时间后,第一次请求出现 Mix\Database\Pool\ConnectionPool::borrow(): Send of 5 bytes failed with errno=32 Broken pipe

Open popfaker opened this issue 2 years ago • 5 comments

我是在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(); // 必须放到最后,防止触发协程调度导致异常

    }


}

popfaker avatar Jan 16 '24 01:01 popfaker

$maxLifetime = 3600; // 连接的最长生命周期

注意这个,要检查和mysql的my.cnf有个配置是连接闲置时间,mysql会自动kill连接,所以 $maxLifetime 要小于那个mysql配置的时间。

onanying avatar Jan 18 '24 03:01 onanying

$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

popfaker avatar Jan 19 '24 01:01 popfaker

Send of 5 bytes failed with errno=32 Broken pipe

说明连接已经断开了,并且是mysql server主动断开的

onanying avatar Jan 19 '24 07:01 onanying

image

https://www.kancloud.cn/onanying/mixphp2-2/1712317

onanying avatar Jan 19 '24 07:01 onanying

image https://www.kancloud.cn/onanying/mixphp2-2/1712317

感谢老哥,我下午测试的$maxLifetime = interactive_timeout 和wait_timeout依旧会出现错误,我现在试试把$maxLifetime改为3500试试

popfaker avatar Jan 19 '24 13:01 popfaker