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人。。我推荐第一种。