Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 错误:[8]PDO::_construct():发送5个字节失败,错误号为32的管道断裂_Php_Pdo_Mariadb - Fatal编程技术网

Php 错误:[8]PDO::_construct():发送5个字节失败,错误号为32的管道断裂

Php 错误:[8]PDO::_construct():发送5个字节失败,错误号为32的管道断裂,php,pdo,mariadb,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

我一直随机得到以下错误:

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_timeout
max_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());
    }
}

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

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

与正常连接不同,持久连接只有在您关闭它们时才会关闭。对于长进程非常有用,这样服务器就不需要每次都重新连接到数据库,这样就不需要对数据库是否仍然连接进行某种检查。但是,这意味着您需要存储句柄,并在完成后自己关闭它,以避免过度消耗池中的资源

脚本执行完毕后,正常连接将被抛出回连接池。它们仍然打开(如果长时间不使用,则关闭),并在下一个请求中重新使用。由于PHP是建立在HTTP协议之上的,在大多数情况下,请求不会花费超过一秒钟的时间来完成,因此使用任何持久性连接都没有什么意义

因此,除非您有一个较长的进程,否则可能是套接字服务器的持久连接已满

因此,只需禁用它或删除以下行:

PDO::ATTR_PERSISTENT => true,

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

向我们展示PHP方面的实际情况?我怀疑连接池已满,这意味着您可能使用了持久连接。可能不想这样做,因为在我诚实的观点中,它在大多数情况下产生的问题比它解决的问题要多。是的,
PDO::ATTR_PERSISTENT=>false,
或删除该行将解决问题。但是持久连接可能很有用。您启用它有什么特别的原因吗?正是因为它很有用:D.只有当我更新到10.2.13时,它才开始出现,并且在MariaDB 10.1.xx上运行时没有任何错误。实际上我需要10.2.xx,因为它支持json数据类型。。你用插座,蒸汽?漫长的过程?持久性有其使用案例,但连接池也非常有效。无论哪种方式,都可以将其设置为false或允许更多连接,然后重新启动服务。所以除非你的网站上每秒有超过100人。。我推荐第一种。