NT Man
Новичок
Как вы считаете должны ли уничтожатся все переменные, которые станут недоступны при выкидывании исключения?
продемонстрирую на примере:
Если в функции inner_fn2 выкинуть exception, то поидее $sth созданный в inner_fn1 будет недоступен в обработчике исключения, который по вложенности кода расположен выше. На это можно было бы забить, если ни одно очень большое НО. Дело в том, что в обработчике исключения мы что-то делаем с базой дальше. В конкретном примере ролбачим базу, но там может быть все что угодно. И тут оказывается, что мы это сделать не можем из-за того, что база ждет когда мы получим от неё все резалтсеты. А мы их не получить не можем ни за ансетить из за того что гдето до этого взорвался эксепшен.
Решения тут вижу два. Либо имплементироваровать чтонибудь в PDO для принудительного охлаждения базы, либо заставить ядро PHP правильно освобождать память. По мне так первый вариант костыль, но при должном усердии я его смогу реализовать, но не факт, что его примут в апстим. что думаете насчет второго варианта? Я сразу говорю я там пас, нужен чел который хорошо разбирается в ядре, чтобы однозначно ответить почему PHP так не делает сейчас и возможно ли его заставить так делать.
продемонстрирую на примере:
PHP:
#!/usr/bin/php
<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
function inner_fn1($db) {
$sth = $db->query('select 1; select 2');
inner_fn2($sth);
}
function inner_fn2($sth) {
$data = $sth->fetchAll(PDO::FETCH_ASSOC);
throw new exception ('some error');
unset($sth);
}
$attr = array(
PDO::ATTR_PERSISTENT => true
,PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
//,PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false
,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
$db = new PDO('mysql:dbname=BPLnew;unix_socket=/var/lib/mysql/mysql.sock','root','', $attr);
$db->query('START TRANSACTION');
try {
inner_fn1($db);
} catch(Exception$e) {
echo("$e\n");
echo("============================================================\n");
//$sth->closeCursor();
//unset($sth);
//$db->free();
$db->query('ROLLBACK');
}
$db->query('ROLLBACK');
?>
Если в функции inner_fn2 выкинуть exception, то поидее $sth созданный в inner_fn1 будет недоступен в обработчике исключения, который по вложенности кода расположен выше. На это можно было бы забить, если ни одно очень большое НО. Дело в том, что в обработчике исключения мы что-то делаем с базой дальше. В конкретном примере ролбачим базу, но там может быть все что угодно. И тут оказывается, что мы это сделать не можем из-за того, что база ждет когда мы получим от неё все резалтсеты. А мы их не получить не можем ни за ансетить из за того что гдето до этого взорвался эксепшен.
Решения тут вижу два. Либо имплементироваровать чтонибудь в PDO для принудительного охлаждения базы, либо заставить ядро PHP правильно освобождать память. По мне так первый вариант костыль, но при должном усердии я его смогу реализовать, но не факт, что его примут в апстим. что думаете насчет второго варианта? Я сразу говорю я там пас, нужен чел который хорошо разбирается в ядре, чтобы однозначно ответить почему PHP так не делает сейчас и возможно ли его заставить так делать.