Bug #58863 [Opn->Wfx]: Reconnect support broken

From: Date: Wed, 02 Oct 2013 05:52:00 +0000
Subject: Bug #58863 [Opn->Wfx]: Reconnect support broken
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-181929@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=58863&edit=1

 ID:                 58863
 Updated by:         mike@php.net
 Reported by:        marion dot jeff at gmail dot com
 Summary:            Reconnect support broken
-Status:             Open
+Status:             Wont fix
 Type:               Bug
-Package:            PDO_MYSQL
+Package:            *General Issues
 Operating System:   *nix (Centos 4/5, Arch)
 PHP Version:        5.2.8
 Block user comment: N
 Private report:     N

 New Comment:

PECL PDO packages are obsolete.


Previous Comments:
------------------------------------------------------------------------
[2011-07-01 05:24:55] sinomad123 at gmail dot com

I've got the same problem,too. PDO class does not have a reconnect function.When reading the
source, I found the broken code. So I have to make some change as below:

mysql_driver.c:
-------------
594
(added) long reconnect = pdo_attr_bval(driver_options, PDO_MYSQL_ATTR_RECONNECT, 0 TSRMLS_CC);
595

639 	//#ifdef MYSQL_OPT_RECONNECT
640 	/* since 5.0.3, the default for this option is 0 if not specified.
641 	* we want the old behaviour */
642 	if( reconnect ){
643 	long reconnect = 1;
644 	mysql_options(H->server, MYSQL_OPT_RECONNECT, (const char*)&reconnect);
645 	}
646 	//#endif 

php_pdo_mysql_int.h
-------------------
159 	PDO_MYSQL_ATTR_INIT_COMMAND, 
(added) MYSQL_OPT_RECONNECT,

pdo_mysql.c
-----------
72 	REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_INIT_COMMAND",
(long)PDO_MYSQL_ATTR_INIT_COMMAND); 
(added) REGISTER_PDO_CLASS_CONST_LONG("MYSQL_OPT_RECONNECT",
(long)PDO_MYSQL_OPT_RECONNECT); 

implemention of function pdo_attr_bval:(in pdo/php_pdo_driver.h)
--------------
static inline long pdo_attr_bval(zval *options, enum pdo_attribute_type option_name, long defval
TSRMLS_DC)
{
    zval **v;
    if (options && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(options), option_name,
(void**)&v)) {
        convert_to_boolean_ex(v);
        return Z_BVAL_PP(v);
    }
    return defval;
}

after make&install, you can use pdo_options to set MYSQL_OPT_RECONNECT:
$conn = new PDO('mysql:host=xxx', 'xx',
'xx',array(PDO::MYSQL_OPT_RECONNECT=>true));

hope this will help.

------------------------------------------------------------------------
[2011-06-05 04:02:50] marion dot jeff at gmail dot com

Reopening as there hasn't been any follow-up or comment.

------------------------------------------------------------------------
[2011-05-30 17:31:10] marion dot jeff at gmail dot com

Johannes,

If the current PDO stance on the issue is that you don't want to allow for even an optional
enablement of the underlying MySQL OPT_RECONNECT behavior that's your prerogative.

However, it seems the exact opposite decision was made in the past by the PDO_MYSQL maintainers when
they chose to add code which explicitly enabled auto-reconnect behavior in the driver following the
MySQL 5.0.3 change to the OPT_RECONNECT default. The existence of that code is the basis for this
bug. That code is in fact broken. Lines 639-646 in the PHP 5.4 branch are not just dead code which
is impossible to ever reach but both the code and comment are very misleading. Additionally there is
another block up code (633-638) which makes the same mistake of trying to ifdef based on one of the
MYSQL_OPT_ enums, which are not available to the preprocessor and so will always fail to match.

If the project has changed it's mind about the reconnect behavior and wants it to  be
intentionally off that is fine by me but please fix the code so it represents this decision and
ideally add some documentation about the behavior change that occurred.

Feel free to contact me off list to discuss.

------------------------------------------------------------------------
[2011-05-26 08:27:24] johannes at schlueters dot de

Doing a magic reconnect without notice to the user is bad as the connection looses its state
(prepared statements become invalid, session variables are lost, temporary tables go away, ...)

A manual reconnect also won't be implemented as MySQL specific feature. Please report it at
bugs.php.net as general PDO request if you think this is really think this is useful.

------------------------------------------------------------------------
[2011-01-13 20:47:57] datibbaw@php.net

Just came across this ticket when I realized that PDO doesn't 
have a reconnect method and assumed it was done "magically"; 
so I was surprised that this still doesn't work in 5.3.4

It would be really nice if this behaviour could be governed 
via a PDO:: parameter, specifically for MySQL or otherwise.

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=58863


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=58863&edit=1


Thread (1 message)

  • mike@php.net
  • Unknown Message
    • mike@php.net
« previous php.bugs (#181929) next »