Как закрыть соединение с базой sql php
Перейти к содержимому

Как закрыть соединение с базой sql php

  • автор:

mysqli_close

Открытые непостоянные соединения MySQL и наборы результатов автоматически закрываются при уничтожении их объектов. Явное закрытие открытых соединений и освобождение наборов результатов не обязательно. Однако рекомендуется закрыть соединение, как только скрипт завершит выполнение всех своих операций с базой данных, если ему ещё предстоит большая обработка после получения результатов.

Список параметров

Только для процедурного стиля: объект mysqli , полученный с помощью mysqli_connect() или mysqli_init() .

Возвращаемые значения

Функция всегда возвращает true .

Список изменений

Версия Описание
8.0.0 Функция теперь возвращает значение true . Ранее она возвращала значение false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysqli::close()

mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = new mysqli ( «localhost» , «my_user» , «my_password» , «world» );

$result = $mysqli -> query ( «SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3» );

/* Закройте соединение, как только оно становится ненужным */
$mysqli -> close ();

foreach ( $result as $row ) /* Обработка данных, полученных из базы данных */
>

mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = mysqli_connect ( «localhost» , «my_user» , «my_password» , «world» );

$result = mysqli_query ( $mysqli , «SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3» );

/* Закройте соединение, как только оно становится ненужным */
mysqli_close ( $mysqli );

foreach ( $result as $row ) /* Обработка данных, полученных из базы данных */
>

Примечания

Замечание:

mysqli_close() не закрывает постоянные соединения. Для получения подробностей смотрите руководство по persistent connections.

Смотрите также

  • mysqli::__construct() — Устанавливает новое соединение с сервером MySQL
  • mysqli_init() — Инициализирует MySQLi и возвращает объект для использования в функции mysqli_real_connect()
  • mysqli_real_connect() — Устанавливает соединение с сервером mysql
  • mysqli_free_result() — Освобождает память, занятую результатами запроса

User Contributed Notes

There are no user contributed notes for this page.

  • Copyright © 2001-2023 The PHP Group
  • My PHP.net
  • Contact
  • Other PHP.net sites
  • Privacy policy

mysql_close

Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

  • mysqli_close()
  • PDO: Присвоить значение null объекту PDO

Описание

mysql_close ( resource $link_identifier = NULL ): bool

mysql_close() закрывает непостоянное соединение с базой данных MySQL, на которое указывает переданный дескриптор. Если параметр link_identifier не указан, закрывается последнее открытое (текущее) соединение.

Открытые непостоянные соединения MySQL и результирующие наборы автоматически удаляются сразу по окончании работы PHP-скрипта. Следовательно, закрывать соединения и очищать результирующие наборы не обязательно, но рекомендуется, так как это сразу же освободит ресурсы базы данных и память, занимаемую результатами выборки, что может положительно сказаться на производительности. Больше информации можно почерпнуть в разделе Освобождение ресурсов

Список параметров

Соединение MySQL. Если не указано, то используется последнее соединение, открытое mysql_connect() . Если соединение не найдено или не установлено, то будет сгенерирована ошибка уровня E_WARNING .

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования mysql_close()

$link = mysql_connect ( ‘localhost’ , ‘mysql_user’ , ‘mysql_password’ );
if (! $link ) die( ‘Ошибка соединения: ‘ . mysql_error ());
>
echo ‘Успешно соединились’ ;
mysql_close ( $link );
?>

Результат выполнения данного примера:

Успешно соединились

Примечания

Замечание:

mysql_close() не закрывает постоянные соединения, созданные функцией mysql_pconnect() . Для дополнительной информации смотрите руководство по постоянным соединениям.

Смотрите также

  • mysql_connect() — Открывает соединение с сервером MySQL
  • mysql_free_result() — Освобождает память от результата запроса

User Contributed Notes 6 notes

17 years ago

A little note about multiple simultaneous connections to different hosts.

I work on a site that pulls content primarily from one db but uses a db on a foreign server to verify licensing. One might expect the following to work:

// Open the connection to the primary db
$res1 = mysql_connect ( $host1 , $user1 , $pass1 );
mysql_select_db ( $db1 );

// Open connection to the license server
$res2 = mysql_connect ( $host2 , $user2 , $pass2 );
mysql_select_db ( $db2 , $res2 );

// Pull license data and close when done
mysql_query ( $check_sql , $res2 );
// .
mysql_close ( $res2 );

// Now pull content from the primary db
// Not specifying the resource should default to the last open db
mysql_query ( $query );
// .
?>

Turns out this last query, since it cant find an active connection, will try to connect with mysql_connect() with no paramaters. But if instead you do it as mysql_query($query, $res1), or alternatively, run the mysql_connect for this host again then it works fine. Thus, it doesnt seem to be possible to have code with an overarching «global» db connection interspersed with temporary connections to another host/db.

18 years ago

Be careful when using multiple links to connect to same database (with same username). Unless you specify explicitly in mysql_connect() to create a new link, it will return an already open link. If that would be closed by mysql_close(), it will also (obviously) close the other connection, since the link is the same.
Had lot of trouble figuring it out, since in =4.3.7, all my application broke down because of a single script that did this.

13 years ago

i just came over a problem that i had with apache.

It crashs and said :

«Parent: child process exited with status 3221225477 — Restarting.»

the error came from the extesion php_mysql.dll

i didn’t understand what was the reason of that crash..

Then, i debug the script that i had downloaded and i noticed that that was the function mysql_close() which caused the problem.

The solution is, to send to it the link identifier which is optionnal in the description but cause a crash with no commentary.

Thanks to agneady.

13 years ago

At least with PHP5.3.2 and Windows connecting by tcp, you should always use this mysql_close() function to close and free up the tcp socket being used by PHP. Garbage collection after script execution does not close the tcp socket on its own. The socket would otherwise remain in ‘wait’ state for approximately 30 seconds, and any additional page loads/connection attempts would only add to the total number of open tcp connections. This wait time does not appear to be configurable via PHP settings.

12 years ago

The variable is definitely not optional in 5.3. Caused me a bit of a headache when I was debugging until I realized it was the close function that was causing a hang. So if using just:

mysql_close ( $connection );
?>

(where $connection is any variable of your choice)

18 years ago

As at 5.0.x and 4.3.x: This function should never be used with shared links; instead you should set your link variables to null.
(This explains red’s and beer’s () problems in previous comments)

Here is how shared links work:
— Each link is a resource. mysql_connect() by default looks for a resource with the same paramaters. If one exists, it will return the existing resource.
— Every assignment of that resource to a variable increases the resource’s reference count.
— When the reference is decremented to zero, the underlying TCP/socket connection is closed.
— Every assignment of a variable away from that resource decrements the reference count. (This includes a function level variable going out of scope)
— mysql_close() also decrements the reference count.

Note the last two points: mysql_close() _and_ reassignment of a variable decrement the link’s reference count.

A common mistake is a function like:

function dothings () <
$link = mysql_open (. );
// .. do some queries ..
mysql_close ( $link )
$link = null ;
>
?>

this will decrement the counter twice, possibly closing the underlying connection and causing errors in other parts of the program.

http://bugs.php.net/bug.php?id=30525 «this is not a bug but just how it works»

  • MySQL
    • mysql_​affected_​rows
    • mysql_​client_​encoding
    • mysql_​close
    • mysql_​connect
    • mysql_​create_​db
    • mysql_​data_​seek
    • mysql_​db_​name
    • mysql_​db_​query
    • mysql_​drop_​db
    • mysql_​errno
    • mysql_​error
    • mysql_​escape_​string
    • mysql_​fetch_​array
    • mysql_​fetch_​assoc
    • mysql_​fetch_​field
    • mysql_​fetch_​lengths
    • mysql_​fetch_​object
    • mysql_​fetch_​row
    • mysql_​field_​flags
    • mysql_​field_​len
    • mysql_​field_​name
    • mysql_​field_​seek
    • mysql_​field_​table
    • mysql_​field_​type
    • mysql_​free_​result
    • mysql_​get_​client_​info
    • mysql_​get_​host_​info
    • mysql_​get_​proto_​info
    • mysql_​get_​server_​info
    • mysql_​info
    • mysql_​insert_​id
    • mysql_​list_​dbs
    • mysql_​list_​fields
    • mysql_​list_​processes
    • mysql_​list_​tables
    • mysql_​num_​fields
    • mysql_​num_​rows
    • mysql_​pconnect
    • mysql_​ping
    • mysql_​query
    • mysql_​real_​escape_​string
    • mysql_​result
    • mysql_​select_​db
    • mysql_​set_​charset
    • mysql_​stat
    • mysql_​tablename
    • mysql_​thread_​id
    • mysql_​unbuffered_​query
    • Copyright © 2001-2023 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

    Стоит ли закрывать соединение с БД?

    Стоит ли в пхп-коде после каждого запроса к mysql закрывать соединение с БД, если учесть, что соединение и так закрывается по завершению работы скрипта?

    Отслеживать
    задан 27 фев 2013 в 17:08
    1,664 5 5 золотых знаков 30 30 серебряных знаков 68 68 бронзовых знаков

    2 ответа 2

    Сортировка: Сброс на вариант по умолчанию

    Давайте вспомним старый добрый php.net : по окончанию работы сценария(конец кода/превышение лимита времени) автоматически будет освобождена память, занимаемая сценарием и закрыты все соединения MySQL кроме тех, которые были открыты через mysql_pconnect(если не ошибаюсь). После каждого запроса закрывать соединение не нужно, т.к. уходит очень много времени на повторное подключение, да и в случае ненадобности тоже трогать не нужно, ведь PHP самостоятельно закроет простое соединение по завершению сценария. Есть смысл очищать память от результатов запросов с помощью mysql_free_result.

    Отслеживать
    ответ дан 27 фев 2013 в 19:16
    Андрей Аршинов Андрей Аршинов
    2,529 2 2 золотых знака 16 16 серебряных знаков 41 41 бронзовый знак
    Можно пул подключений использовать.
    3 июн 2017 в 19:00

    После каждого запроса этого делать не надо, так как после первого запроса следующие выполнятся не будут. Достаточно закрывать соединение после выполнения скрипта. Заодно прочитайте это: http://php.net/manual/ru/features.persistent-connections.php

    Отслеживать
    ответ дан 27 фев 2013 в 17:14
    35 6 6 бронзовых знаков

    @admin, спасибо за ответ, на ваши слова «Достаточно закрывать соединение после выполнения скрипта» — мне когда-то на Хэшкоде объясняли, что соединение само закрывается по завершении работы скрипта.

    PHP-подключение к БД MySQL (Два Способа с Примерами)

    PHP-подключение к БД MySQL (Два Способа с Примерами)

    Если вы новичок в разработке сайтов, вам может пригодиться это руководство, объясняющее, как настроить подключение к БД MySQL посредством PHP-скрипта. С помощью этого навыка вы сможете изменять, просматривать и управлять таблицами, созданными в базе данных MySQL. И сейчас мы покажем вам самые простые способы это сделать. Давайте начнём!

    Получите скидку до 85% на наши тарифы хостинга с поддержкой PHP.

    Создание Базы Данных MySQL (При необходимости)

    Этот шаг можно пропустить, если у вас уже есть база данных MySQL. Если вы являетесь пользователем Hostinger, вы можете легко создать новую БД через hPanel — панель управления хостингом Hostinger, следуя простой инструкции:

    Страница Создания БД MySQL в hPanel

    1. Найдите меню «Базы данных MySQL» в разделе «Базы данных».
    2. Заполните все необходимые поля и нажмите «Создать».

    Инструкции по созданию базы данных MySQL с помощью cPanel см. в этом руководстве (англ.). Однако имейте в виду, что это пустые базы данных. Вам нужно будет заполнить их данными, прежде чем вы сможете ими управлять.

    Запишите учётные данные только что созданной базы данных MySQL для следующего шага. А также не забудьте имя пользователя и пароль к БД!

    Два способа PHP-подключения к БД MySQL

    Есть два метода подключения к базе данных MySQL с помощью PHP: MySQLi и PDO.

    MySQLi расшифровывается как MySQL Improved. Это эксклюзивное расширение MySQL, которое добавляет новые функции в интерфейс базы данных. Функции MySQLi являются как процедурными, так и объектно-ориентированными, причём первую парадигму расширение унаследовало от более ранней версии MySQL.

    Сама MySQL разбивает задачу на линейные, пошаговые процедуры, что затрудняет внесение изменений, поскольку вам приходится редактировать код сверху. Между тем MySQLi рассматривает данные как набор взаимозаменяемых объектов с функциями, позволяя пользователям легко добавлять или удалять данные.

    PDO расшифровывается как PHP Data Object, или объект данных PHP. В отличие от MySQLi, PDO является только объектно-ориентированным методом. Он поддерживает ряд различных типов баз данных, использующих PHP, таких как MySQL, MSSQL, Informix и PostgreSQL.

    Исходные функции mysql_ устарели. Их лучше не использовать, поскольку они небезопасны и больше не поддерживаются.

    Одна из наиболее важных функций, которую поддерживают оба метода — это подготовленные выражения (prepared statements). Она сокращает время, необходимое MySQL для выполнения повторяемого запроса. Эта функция также используется для предотвращения SQL-инъекций при внесении изменений в базу данных.

    Какой бы метод вы ни использовали, вам понадобится правильная информация для подключения к созданной вами базе данных MySQL. Здесь вам пригодятся ранее сохранённые данные БД.

    Вам также потребуется правильное имя сервера, или имя хоста для конфигурации. Hostinger использует “localhost” в качестве имени хоста своего сервера MySQL. Это имя, которое вы будете использовать, если загрузите свой PHP-скрипт на тот же сервер, что и база данных.

    С другой стороны, если вы подключаетесь к базе данных из удалённого места (например, со своего компьютера), вам придётся использовать IP-адрес MySQL-сервера. Чтобы получить дополнительную информацию, обратитесь к своему хостинг-провайдеру. Он предоставит вам актуальную информацию о том, какое имя использовать в качестве имени хоста.

    PHP-подключение к БД MySQL с MySQLi

    Выполните следующие действия, чтобы подключить PHP-скрипт к MySQL посредством MySQLi:

    1. Перейдите в Файловый менеджер ->public_html.
    2. Создайте новый файл, щёлкнув на соответствующую иконку в верхнем меню.
    3. Сохраните его как databaseconnect.php. Вы можете заменить имя на любое другое, просто убедитесь, что в качестве расширения используется php.
    4. Дважды щёлкните по файлу, чтобы открыть его. Скопируйте и вставьте в него следующие строки кода. Замените первые четыре значения после учётными данными, которые вы указали ранее.

     echo "Connected successfully"; mysqli_close($conn); ?>

    Объяснение Кода MySQLi

    Основным методом, используемым в этом скрипте, является mysqli_connect (). Это внутренняя функция PHP для установления нового соединения с сервером MySQL.

    В начале нашего кода мы видим несколько объявлений переменных и значений, присвоенных этим переменным. Обычно нам нужно четыре из них, чтобы установить правильное соединение с базой данных: $servername, $database, $username и $password. В коде мы указываем наши данные для доступа к БД как значения для этих переменных, чтобы их можно было передать в функцию.

    Если попытка соединения была неудачной, выполняется функция die(). Она убивает наш скрипт и выдаёт сообщение об ошибке подключения, которое мы прописали. По умолчанию в сообщении об ошибке подключения MySQL будет указано «Connection failed», за которым следует точное сообщение об ошибке с описанием проблемы.

    С другой стороны, если MySQL-соединение установлено успешно, мы увидим сообщение «Connected successfully».

    Последняя часть кода, mysqli_close, позволяет закрыть соединение с базой данных вручную. Если вы ничего не укажите, соединения MySQL закроются автоматически после завершения скрипта.

    PHP-подключение к БД MySQL с PDO

    Другой метод подключения к БД MySQL с использованием PHP-скрипта — через PDO. В целом он похож на предыдущий, но с некоторыми особенностями:

      В public_html создайте файл с названием pdoconfig.php и вставьте следующий код. Как всегда, не забудьте заменить значения плейсхолдеров информацией из вашей базы данных. Сохраните и закройте его, когда закончите.

     catch (PDOException $pe) < die("Could not connect to the database $dbname :" . $pe->getMessage()); >

    Объяснение Скрипта PDO

    Для подключения к базе данных PDO необходимо создать новый объект PDO с именем источника данных (DSN), именем пользователя и паролем.

    DSN определяет тип базы данных, имя базы данных и любую другую информацию, относящуюся к базе данных, если это необходимо. Это переменные и значения, указанные нами в файле dbconfig.php, на которые один раз ссылается строка require_once в файле databaseconnect.php.

    В последнем примере вы найдёте код try… catch... Это означает, что скрипт попытается подключиться к MySQL, используя предоставленный код, но в случае возникновения проблемы будет выполнен код в разделе catch. Вы можете использовать блок catch для отображения сообщений об ошибках подключения или запустить альтернативный код в случае сбоя блока try.

    Если соединение установлено успешно, вы увидите сообщение «Connected to $dbname at $host successfully». Однако, если попытка не удалась, код в блоке catch покажет простое сообщение об ошибке и завершит скрипт.

    Проверка Подключения и Устранение Распространённых Ошибок

    Чтобы проверить, успешно ли установлено соединение, войдите в свой домен так: vashdomen/databaseconnect.php. Если вы назвали PHP-файл другим именем, обязательно укажите правильное название.

    Если всё работает хорошо, вы увидите «Connected successfully» или другой вариант этого сообщения.

    В случае возникновения проблемы при попытке установить соединение, вы увидите сообщения об ошибке. Они отличаются для MySQLi и PDO.

    Ошибка при Неправильном Пароле

    Эта ошибка возникает, если мы меняем пароль или какие-либо учётные данные в PHP-коде (но не меняем их в реальной базе данных).

    Если вы видите сообщение «Access denied» или «Could not connect to database», сопровождаемое “(using password: YES)”, первое, что нужно сделать, это проверить данные для доступа к БД. Возможно, вы сделали опечатку или пропустили какую-то часть.

    Не Удаётся Подключиться к MySQL-серверу

    Если вы видите сообщение «Can’t connect to MySQL server on ‘server’ (110)» в MySQLi, это означает, что скрипт не получил ответа от сервера. Это происходит, когда мы устанавливаем «server» вместо «localhost» в качестве $servername, и имя не распознаётся.

    Сообщение об аналогичной ошибке в PDO будет выглядеть как: «Connection failed: SQLSTATE[Hy000] [2002]». А за ним следует уточнение, что узел MySQL не найден. Причина и решение этой проблемы такое же, как и в предыдущем примере.

    И, конечно же, всегда важно помнить одно золотое правило устранения ошибок: проверять журнал ошибок вашего сайта.

    Журнал находится в той же папке, где запущен скрипт. Например, если мы запускаем сценарий в public_html, error_log будет в той же папке.

    Итоги

    В этом руководстве мы показали, как происходит PHP-подключение к БД MySQL с помощью MySQLi и PHP Data Objects (PDO).

    Надеемся, что это руководство было полезно для тех, кто только начинает заниматься веб-разработкой. В конце концов, подключение к базе данных — это первый и самый важный шаг при работе с более сложными скриптами и конфигурациями.

    Если у вас возникнут какие-либо вопросы после прочтения, не стесняйтесь и напишите нам в комментариях ниже.

    Ольга вже близько восьми років працює менеджером у сфері IT, три з яких вона займається SEO. Написання технічних завдань та інструкцій — один з її основних обов’язків. Її хобі — дізнаватися щось нове і створювати цікаві та корисні статті про сучасні технології, веброзробку, мови програмування, пошукову оптимізацію сайтів та багато іншого.

    mysql_close

    Данный модуль устарел, начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для данной функции:

    • mysqli_close()
    • PDO: Присвоить значение null объекту PDO

    Описание

    mysql_close ( resource $link_identifier = NULL ): bool

    mysql_close() закрывает непостоянное соединение с базой данных MySQL, на которое указывает переданный дескриптор. Если параметр link_identifier не указан, закрывается последнее открытое (текущее) соединение.

    Открытые непостоянные соединения MySQL и результирующие наборы автоматически удаляются сразу по окончании работы PHP-скрипта. Следовательно, закрывать соединения и очищать результирующие наборы не обязательно, но рекомендуется, так как это сразу же освободит ресурсы базы данных и память, занимаемую результатами выборки, что может положительно сказаться на производительности. Больше информации можно почерпнуть в разделе Освобождение ресурсов

    Список параметров

    Соединение MySQL. Если не указано, то используется последнее соединение, открытое mysql_connect() . Если соединение не найдено или не установлено, то будет сгенерирована ошибка уровня E_WARNING .

    Возвращаемые значения

    Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

    Примеры

    Пример #1 Пример использования mysql_close()

    $link = mysql_connect ( ‘localhost’ , ‘mysql_user’ , ‘mysql_password’ );
    if (! $link ) die( ‘Ошибка соединения: ‘ . mysql_error ());
    >
    echo ‘Успешно соединились’ ;
    mysql_close ( $link );
    ?>

    Результат выполнения данного примера:

    Успешно соединились

    Примечания

    Замечание:

    mysql_close() не закрывает постоянные соединения, созданные функцией mysql_pconnect() . Для дополнительной информации смотрите руководство по постоянным соединениям.

    Смотрите также

    • mysql_connect() — Открывает соединение с сервером MySQL
    • mysql_free_result() — Освобождает память от результата запроса

    User Contributed Notes 6 notes

    17 years ago

    A little note about multiple simultaneous connections to different hosts.

    I work on a site that pulls content primarily from one db but uses a db on a foreign server to verify licensing. One might expect the following to work:

    // Open the connection to the primary db
    $res1 = mysql_connect ( $host1 , $user1 , $pass1 );
    mysql_select_db ( $db1 );

    // Open connection to the license server
    $res2 = mysql_connect ( $host2 , $user2 , $pass2 );
    mysql_select_db ( $db2 , $res2 );

    // Pull license data and close when done
    mysql_query ( $check_sql , $res2 );
    // .
    mysql_close ( $res2 );

    // Now pull content from the primary db
    // Not specifying the resource should default to the last open db
    mysql_query ( $query );
    // .
    ?>

    Turns out this last query, since it cant find an active connection, will try to connect with mysql_connect() with no paramaters. But if instead you do it as mysql_query($query, $res1), or alternatively, run the mysql_connect for this host again then it works fine. Thus, it doesnt seem to be possible to have code with an overarching «global» db connection interspersed with temporary connections to another host/db.

    18 years ago

    Be careful when using multiple links to connect to same database (with same username). Unless you specify explicitly in mysql_connect() to create a new link, it will return an already open link. If that would be closed by mysql_close(), it will also (obviously) close the other connection, since the link is the same.
    Had lot of trouble figuring it out, since in =4.3.7, all my application broke down because of a single script that did this.

    13 years ago

    i just came over a problem that i had with apache.

    It crashs and said :

    «Parent: child process exited with status 3221225477 — Restarting.»

    the error came from the extesion php_mysql.dll

    i didn’t understand what was the reason of that crash..

    Then, i debug the script that i had downloaded and i noticed that that was the function mysql_close() which caused the problem.

    The solution is, to send to it the link identifier which is optionnal in the description but cause a crash with no commentary.

    Thanks to agneady.

    13 years ago

    At least with PHP5.3.2 and Windows connecting by tcp, you should always use this mysql_close() function to close and free up the tcp socket being used by PHP. Garbage collection after script execution does not close the tcp socket on its own. The socket would otherwise remain in ‘wait’ state for approximately 30 seconds, and any additional page loads/connection attempts would only add to the total number of open tcp connections. This wait time does not appear to be configurable via PHP settings.

    12 years ago

    The variable is definitely not optional in 5.3. Caused me a bit of a headache when I was debugging until I realized it was the close function that was causing a hang. So if using just:

    mysql_close ( $connection );
    ?>

    (where $connection is any variable of your choice)

    18 years ago

    As at 5.0.x and 4.3.x: This function should never be used with shared links; instead you should set your link variables to null.
    (This explains red’s and beer’s () problems in previous comments)

    Here is how shared links work:
    — Each link is a resource. mysql_connect() by default looks for a resource with the same paramaters. If one exists, it will return the existing resource.
    — Every assignment of that resource to a variable increases the resource’s reference count.
    — When the reference is decremented to zero, the underlying TCP/socket connection is closed.
    — Every assignment of a variable away from that resource decrements the reference count. (This includes a function level variable going out of scope)
    — mysql_close() also decrements the reference count.

    Note the last two points: mysql_close() _and_ reassignment of a variable decrement the link’s reference count.

    A common mistake is a function like:

    function dothings () <
    $link = mysql_open (. );
    // .. do some queries ..
    mysql_close ( $link )
    $link = null ;
    >
    ?>

    this will decrement the counter twice, possibly closing the underlying connection and causing errors in other parts of the program.

    http://bugs.php.net/bug.php?id=30525 «this is not a bug but just how it works»

    • MySQL
      • mysql_​affected_​rows
      • mysql_​client_​encoding
      • mysql_​close
      • mysql_​connect
      • mysql_​create_​db
      • mysql_​data_​seek
      • mysql_​db_​name
      • mysql_​db_​query
      • mysql_​drop_​db
      • mysql_​errno
      • mysql_​error
      • mysql_​escape_​string
      • mysql_​fetch_​array
      • mysql_​fetch_​assoc
      • mysql_​fetch_​field
      • mysql_​fetch_​lengths
      • mysql_​fetch_​object
      • mysql_​fetch_​row
      • mysql_​field_​flags
      • mysql_​field_​len
      • mysql_​field_​name
      • mysql_​field_​seek
      • mysql_​field_​table
      • mysql_​field_​type
      • mysql_​free_​result
      • mysql_​get_​client_​info
      • mysql_​get_​host_​info
      • mysql_​get_​proto_​info
      • mysql_​get_​server_​info
      • mysql_​info
      • mysql_​insert_​id
      • mysql_​list_​dbs
      • mysql_​list_​fields
      • mysql_​list_​processes
      • mysql_​list_​tables
      • mysql_​num_​fields
      • mysql_​num_​rows
      • mysql_​pconnect
      • mysql_​ping
      • mysql_​query
      • mysql_​real_​escape_​string
      • mysql_​result
      • mysql_​select_​db
      • mysql_​set_​charset
      • mysql_​stat
      • mysql_​tablename
      • mysql_​thread_​id
      • mysql_​unbuffered_​query
      • Copyright © 2001-2023 The PHP Group
      • My PHP.net
      • Contact
      • Other PHP.net sites
      • Privacy policy

      mysqli_close

      Открытые непостоянные соединения MySQL и наборы результатов автоматически закрываются при уничтожении их объектов. Явное закрытие открытых соединений и освобождение наборов результатов не обязательно. Однако рекомендуется закрыть соединение, как только скрипт завершит выполнение всех своих операций с базой данных, если ему ещё предстоит большая обработка после получения результатов.

      Список параметров

      Только для процедурного стиля: объект mysqli , полученный с помощью mysqli_connect() или mysqli_init() .

      Возвращаемые значения

      Функция всегда возвращает true .

      Список изменений

      Версия Описание
      8.0.0 Функция теперь возвращает значение true . Ранее она возвращала значение false в случае возникновения ошибки.

      Примеры

      Пример #1 Пример использования mysqli::close()

      mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
      $mysqli = new mysqli ( «localhost» , «my_user» , «my_password» , «world» );

      $result = $mysqli -> query ( «SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3» );

      /* Закройте соединение, как только оно становится ненужным */
      $mysqli -> close ();

      foreach ( $result as $row ) /* Обработка данных, полученных из базы данных */
      >

      mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
      $mysqli = mysqli_connect ( «localhost» , «my_user» , «my_password» , «world» );

      $result = mysqli_query ( $mysqli , «SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3» );

      /* Закройте соединение, как только оно становится ненужным */
      mysqli_close ( $mysqli );

      foreach ( $result as $row ) /* Обработка данных, полученных из базы данных */
      >

      Примечания

      Замечание:

      mysqli_close() не закрывает постоянные соединения. Для получения подробностей смотрите руководство по persistent connections.

      Смотрите также

      • mysqli::__construct() — Устанавливает новое соединение с сервером MySQL
      • mysqli_init() — Инициализирует MySQLi и возвращает объект для использования в функции mysqli_real_connect()
      • mysqli_real_connect() — Устанавливает соединение с сервером mysql
      • mysqli_free_result() — Освобождает память, занятую результатами запроса

      User Contributed Notes

      There are no user contributed notes for this page.

      • Copyright © 2001-2023 The PHP Group
      • My PHP.net
      • Contact
      • Other PHP.net sites
      • Privacy policy

      Стоит ли закрывать соединение с БД?

      Стоит ли в пхп-коде после каждого запроса к mysql закрывать соединение с БД, если учесть, что соединение и так закрывается по завершению работы скрипта?

      Отслеживать
      задан 27 фев 2013 в 17:08
      1,664 5 5 золотых знаков 30 30 серебряных знаков 68 68 бронзовых знаков

      2 ответа 2

      Сортировка: Сброс на вариант по умолчанию

      Давайте вспомним старый добрый php.net : по окончанию работы сценария(конец кода/превышение лимита времени) автоматически будет освобождена память, занимаемая сценарием и закрыты все соединения MySQL кроме тех, которые были открыты через mysql_pconnect(если не ошибаюсь). После каждого запроса закрывать соединение не нужно, т.к. уходит очень много времени на повторное подключение, да и в случае ненадобности тоже трогать не нужно, ведь PHP самостоятельно закроет простое соединение по завершению сценария. Есть смысл очищать память от результатов запросов с помощью mysql_free_result.

      Отслеживать
      ответ дан 27 фев 2013 в 19:16
      Андрей Аршинов Андрей Аршинов
      2,529 2 2 золотых знака 16 16 серебряных знаков 41 41 бронзовый знак
      Можно пул подключений использовать.
      3 июн 2017 в 19:00

      После каждого запроса этого делать не надо, так как после первого запроса следующие выполнятся не будут. Достаточно закрывать соединение после выполнения скрипта. Заодно прочитайте это: http://php.net/manual/ru/features.persistent-connections.php

      Отслеживать
      ответ дан 27 фев 2013 в 17:14
      35 6 6 бронзовых знаков

      @admin, спасибо за ответ, на ваши слова «Достаточно закрывать соединение после выполнения скрипта» — мне когда-то на Хэшкоде объясняли, что соединение само закрывается по завершении работы скрипта.

      Как закрыть соединение с базой sql php

      Здравствуйте, такой вопрос зачем существует функция закрытия соединения с sql: mysql_close($link), что это дает?

      автор: Sfinks (15.02.2012 в 17:47) письмо автору

      Закрывает соединение открытое функцией mysql_connect().
      Как правило она не нужна, т.к. соединение автоматически закрывается по завершении выполнения скрипта. Однако это так, если ваш скрипт выполняется очень быстро. Просто сервер БД имеет ограниченное число подключений и, например, если у вас скрипт подключается к базе, выбирает данные, а потом 15 минут их обрабатывает, не обращаясь более к БД, то лучше после выборки закрыть соединение, т.к. может случиться так, что этот самый скрипт одновременно запустят несколько пользователей. И если их количество превысит предельно допустимое количество соединений с БД, то все следующие пользователи подключиться уже не смогут и получат ошибку соединения с БД.

      автор: cheops (15.02.2012 в 18:06) письмо автору

      Добавлю еще, что пока соединение занято, им не может воспользоваться другой клиент, а под соединение выделяется довольно много серверной памяти. Если таких задумчивых клиентов с незакрытыми соединениями становится много, то память на сервере быстро иссякает и начинают тормозить другие клиенты (или очередные клиенты получают отказ в обслуживании). Кроме того, MySQL, да и любая другая база данных может применяться не только в Web, а при обслуживании других программ и серверов (например, доменные имена можно не вручную прописывать в конфигурационных файлах, а централизованного хранить в базе данных). Если не закрывать соединения утечка памяти может принимать катастрофический характер. Бывало так, не настроенный и не перебранный дистрибутив через неделю работы распухал на лишний гигабайт оперативной памяти (понятно, что не из-за закрытых соединений с базой данных, а из-за утечек в множестве самых разных сервисах). Однако, проблема остается проблемой — взятые ресурсы нужно возвращать, и чем скорее, тем лучше. В PHP проблема возникает не часто, но чуть копнуть глубже — встает в полный рост, особенно, когда вы набрали памяти, по-наоткрывали файлов, соединений и возникает какая-то ошибка и вам теперь предстоит все закрыть и вернуть и не штатно в конце, а по-середине программы. Если вы когда-нибудь зададитесь вопросом зачем ввели исключения, знайте — вот за ради этого.

      автор: Dazzl (16.02.2012 в 16:52) письмо автору

      Спасибо вам обоим! вы мне очень помогли 🙂 . как всегда.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *