错误:[8] PDO :: __ construct():发送5个字节失败,errno = 32 Broken pipe

时间:2018-03-10 14:29:50

标签: php pdo mariadb

我随机收到以下错误:

Error: [8] PDO::__construct(): send of 5 bytes failed with errno=32 Broken pipe
第33行的/var/www/test/includes/classes/class.Database.php中的

一切都很好,直到我将Maria DB升级到10.2.xx 服务器设置是:

PHP 7.0.27-0+deb9u1 (cli) (built: Jan  5 2018 13:51:52) ( NTS )
mysql  Ver 15.1 Distrib 10.2.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

我尝试增加wait_timeoutmax_allowed_packet我也启用了pdo_mysql,但似乎没有任何区别。 有谁知道哪里可以成为问题? 我怀疑升级之前将Maria DB从10.1.xx升级到10.2.xx我没有看到这样的错误,即使我从Ubuntu 16.04切换到Debian 9。

public function __construct($host, $user,$pass, $dbname, $charset, $prefix){
    $this->host = $host;
    $this->user = $user;
    $this->pass = $pass;
    $this->dbname = $dbname;
    $this->charset = $charset;
    $this->prefix = $prefix;

    // Set DSN
    $dsn = 'mysql:host='.$this->host.';dbname='.$this->dbname.';charset='.$this->charset;
    // Set options
    $options = array(
        PDO::ATTR_PERSISTENT => true,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => true
    );
    // Create a new PDO instanace
    try{
        $this->dbh = new PDO($dsn, $this->user, $this->pass, $options); //this is line 33
    }
    // Catch and log all errors
    catch(PDOException $e){
        $this->error = $e->getMessage();
        error_log($e->getMessage());
    }
}

1 个答案:

答案 0 :(得分:0)

有这样的错误消息很难确定问题的确切原因。但有一件事我们知道,它无法连接。

最可能的原因是它没有可用的连接,而且与PHP结合使用通常是由持久连接引起的。

与普通连接不同,关闭它们时,持久连接关闭。对于长进程很有用,因此服务器不需要每次都重新连接到数据库,因此如果数据库仍然连接,您不需要进行某种检查。但这意味着您需要存放手柄并在完成时自行关闭它以避免过度耗尽游泳池。

当脚本执行完毕后,正常连接将重新投入连接池。它们仍然打开(如果长时间不使用则关闭)并重新用于下一个请求。由于PHP建立在HTTP协议的基础之上,在大多数情况下,请求不需要花费超过一秒的时间才能完成,因此使用任何持久性连接都没有意义。

因此,除非你有一个很长的进程,否则一个套接字服务器可能会使用一个持久连接。

所以只需禁用它或删除以下行:

PDO::ATTR_PERSISTENT => true,

或..如果仍然想要使用持久连接,请更改数据库configuration以允许更多连接,但这很可能会延长问题再次重新启动之前的时间。