|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #78972 Pdo close error
Submitted: 2019-12-16 16:15 UTC Modified: -
Avg. Score:5.0 ± 0.0
Reproduced:2 of 2 (100.0%)
Same Version:1 (50.0%)
Same OS:2 (100.0%)
From: xzzll at msn dot cn Assigned:
Status: Open Package: PDO Core
PHP Version: 7.3.12 OS: Centos7
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
Block user comment
Status: Assign to:
Bug Type:
From: xzzll at msn dot cn
New email:
PHP Version: OS:


 [2019-12-16 16:15 UTC] xzzll at msn dot cn
Errors in some cases when pdo ends the connection.

I can't locate the details of this issue for now because it happens randomly.

The demo code I provided is almost the same as the actual business code, they work persistently under cli and perform close and reopen on timeout connections.

However, the connection may be interrupted automatically due to network fluctuations or server timeouts.When the mysql connection in some processes is persistent and no activity is triggered again, an exception occurs.(My mysql server is remote)

Msg : \Game\Sql\Pdo::close(): send of 5 bytes failed with errno=32 Broken pipe

Since the demo code is more than 20 lines, I scaled it. Please format it and view it. I am very sorry for the trouble.

It is important to note that this problem does not absolutely recur, it happens randomly, and when the problem occurs, it is in a long-term vacant state.

Test script:
namespace test;class Pdo{public static $db;public static $start;public static $timeout;
    public static function init($config){try {
            self::$db = new \PDO('mysql:dbname=' . $config['table'] . ';host=' . $config['server'] . ';port=' . $config['port'] . ';charset=utf8', $config['user'], $config['password'], [
                \PDO::ATTR_PERSISTENT => false,
        } catch (\Throwable $th) {var_dump($th);return;}
        self::$start   = time();self::$timeout = (self::$db->query('show variables like "wait_timeout"')->fetch(MYSQLI_ASSOC))['Value'];
        echo ("-------------------MYSQLConnect timeout=" . self::$timeout . " ServerVersion=" . self::$db->query('select version()')->fetchColumn() . "-------------------");}
    public static function close(){self::$db = null;}
    public static function uinit(){self::close();$time = microtime(true);echo ("-------------------ReConnect:" . $time . "-------------------");self::init(require(__DIR__ . '/think/config/MysqlConfig.php'));echo ("-------------------ConnectOk:" . (microtime(true) - $time) . "-------------------");}
    public static function test(){if (time() - self::$start >= self::$timeout) {$this->uinit();}}
\test\Pdo::init(require_once __DIR__ . '/think/config/MysqlConfig.php');
sleep(\test\Pdo::$timeout + 10); //The time here should actually be very long
\test\Pdo::test(); //error 
/*SyStemNotice:Code:   8
File: /root/Game/think/system/Sql/Pdo.php:29
Msg : \Game\Sql\Pdo::close(): send of 5 bytes failed with errno=32 Broken pipe*/

Expected result:
Ideally, it should close the connection normally, or end directly when the connection is unavailable, so that the code can continue to perform the connection work, but in fact it throws a notice error

Actual result:
Code:   8
File: /root/Game/think/system/Sql/Pdo.php:29
Msg : \Game\Sql\Pdo::close(): send of 5 bytes failed with errno=32 Broken pipe


Add a Patch

Pull Requests

Add a Pull Request

PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Sun Jul 05 07:01:26 2020 UTC