Зачем закрывать подключения?

282
30 июня 2017, 06:30

Здравствуйте.

Разбираюсь с mysqli, в частности с этим примером:

<?php
    $link = mysqli_connect("localhost", "my_user", "my_password", "world");
    /* проверка подключения */
    if (mysqli_connect_errno()) {
        printf("Не удалось подключиться: %s\n", mysqli_connect_error());
        exit();
    }
    $query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";
    if ($result = mysqli_query($link, $query)) {
        /* выборка данных и помещение их в массив */
        while ($row = mysqli_fetch_row($result)) {
            printf ("%s (%s)\n", $row[0], $row[1]);
        }
        /* очищаем результирующий набор */
        mysqli_free_result($result);
    }
    /* закрываем подключение */
    mysqli_close($link);
    ?>

И напросился вопрос: зачем нужно очищать результат набора, mysqli_free_result($result);, закрывать подключения mysqli_close($link); и чем плохо, если этого не делать?

Answer 1

Непонятно, откуда предыдущий оратор вообразил какой-то "таймаут".

Соединение с БД закрывать не надо - оно закроется само по окончании работы скрипта. Сразу. БЕЗ каких-либо "таймаутов".

Резалтсет в большинстве случаев очищать не нужно, поскольку как только закончит выполнение вызвавшая его функция, он так же обнулится.

Answer 2

Незакрытые соединения прибьются по таймауту. Но если таких подключений будет очень много, система будет тормозить очень сильно, так как всё это потребляемые ресурсы. Поэтому "уходя, гасите свет". mysql_options php.su и оф. доки dev.mysql.com/doc/mysql-options

Рекомендую для общего развития установить VirtualBox с *nix системой, установить веб-сервер+mysql и поиграться с настройками, чтобы наглядно увидеть, что и как работает.

mysqli_free_result - очищает используемый блок памяти.

Если простыми словами то - при выполнения кода, к примеру запрос съел 100мб памяти и не была применена команда mysqli_free_result то если дальше по коду есть ещё запросы то они будут ещё дожирать память в дополнение к уже используемой. А если выполним mysqli_free_result то память занятая запросом очистится и мы сможем повторно её использовать в этом же коде.

Если у Вас в выполняемом коде один запрос, то mysqli_free_result необязателен, так как при завершении выполнении кода память всё равно очистится, но если по коду будет множество запросов то лучше очищать используемую память.

Пример 1:

php-код
1 sql-запрос # использовал 10мб памяти
php-код
2  sql-запрос # использовал 5мб памяти

В итоге получается что для выполнения кода потребовалось 15мб памяти, так как используемую память мы не очищали и она содержала первый запрос.

Пример 2:

php-код
1 sql-запрос # использовал 10мб памяти
mysqli_free_result (очищает уже задействованные 10мб памяти в которые можно записать последующие запросы)
php-код
2  sql-запрос # использовал 5мб памяти

Для выполнения кода потребовалось 10мб памяти, так как мы очистили память от первого запроса и записали в неё второй.

READ ALSO
Получение Текста с поля TextField JavaFx Scene Builder

Получение Текста с поля TextField JavaFx Scene Builder

В моем графическом приложение есть текстовое поле(txtField) и кнопка "Search"При запуске приложения, открывается приложение и пользователь может...

391
Как отправить сообщение боту в Telegram через java? [требует правки]

Как отправить сообщение боту в Telegram через java? [требует правки]

Вроде бы легкая задача, но в API не нашел подобного, либо плохо искалjava

222