Re: [PDO] Shared behavior of persistent connections
[email protected] (Matteo Beccati) Fri, 9 Sep 2016 08:23:51 +0200
| Newsgroups | php.pdo |
|---|---|
| Message-ID | <[email protected]> |
Hi Christoph,
I try to stay away as much as possible from persistent connections as
they can cause more issues than what they actually solve. I think I even
never used them on PDO.
That said, yes that's the behaviour I would expect. Transactions should
be rolled back and the environment should be completely clean from
anything that's suppose to last for the current session only.
Cheers
On 02/09/2016 14:18, Christoph M. Becker wrote:
> Hi!
>
> I wonder whether the shared behavior of persistent PDO connections is
> really desired, as it is implemented now.
>
> I stumbled upon this issue when I tried to resolve bug #63343[1] with PR
> #2112[2]. Nikita pointed out the actual problem, namely that destroying
> a PDO object will rollback the transaction on the inner object[3].
> Digging a bit deeper brought up the issue that not only a transaction
> would be rolled back, but also that the persistent_shutdown() method
> will be called in that case. Consider the following script:
>
> <?php
> function foo() {return 1;}
>
> $db1 = new PDO('sqlite::memory:', '', '',
> array(PDO::ATTR_PERSISTENT => true));
> $db1->sqliteCreateFunction('foo', 'foo', 0);
>
> $st1 = $db1->query('select foo()');
> echo $st1->fetchColumn();
>
> //$db1 = $st1 = null;
>
> $db2 = new PDO('sqlite::memory:', '', '',
> array(PDO::ATTR_PERSISTENT => true));
>
> $st2 = $db2->query('select foo()');
> echo $st2->fetchColumn();
>
> The output is `11`. However, uncommenting the line which will force the
> destruction of $db1, will also unregister the `foo` function, so the
> second ::query() will fail. This can be quite confusing in a more
> complex script.
>
> Furthermore, in php_pdo_driver.h `pdo_dbh_request_shutdown` is
> documented as[4]:
>
> | called at request end for each persistent dbh; this gives the driver
> | the opportunity to safely release resources that only have per-request
> | scope
>
> However, `pdo_dbh_request_shutdown` isn't just necessarily called only
> at the end of the request, as shown above.
>
> Anyhow, if the shared behavior of persistent connections works as
> intented, the documentation should be updated respectively (and bug
> #63343 closed as being not a bug).
>
> [1] <https://bugs.php.net/bug.php?id=63343>
> [2] <https://github.com/php/php-src/pull/2112>
> [3] <https://github.com/php/php-src/pull/2112#discussion_r77312340>
> [4]
> <https://github.com/php/php-src/blob/PHP-7.0.11/ext/pdo/php_pdo_driver.h#L279-L282>
>
--
Matteo Beccati
Development & Consulting - http://www.beccati.com/