Hi Matteo!

Thanks for responding. :-)

I'm forwarding to internals as per Kalle's suggestion.

Cheers!

On 09.09.2016 at 08:23, Matteo Beccati wrote:

> 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>
>>
>>
> 
> 

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to