Чи важливо закривати підключення mysql?


88

Чи критично важливо закрити ефективність підключень mysql, або воно автоматично закривається після запуску php-файлу?


Дивіться це питання теж stackoverflow.com/questions/336078/…
alex

Я думаю, те саме стосується ftp_close?
doc_id

Чи важливо закривати підключення mysql? так, це як деструктор в c ++
jasinth premkumar

Відповіді:


89

З документації :

Примітка: Посилання на сервер буде закрито, як тільки закінчується виконання сценарію, якщо воно не закривається раніше, явно викликавши mysql_close ().

Якщо ваш скрипт має достатньо обробки після отримання результату та отримав повний набір результатів, вам обов'язково слід закрити з'єднання. Якщо ви цього не зробите, існує шанс, що сервер MySQL досягне свого обмеження підключення, коли веб-сервер інтенсивно використовується. Якщо ви не можете закрити підключення MySQL до кінця сценарію, це чистіше, хоча не потрібно робити це явно.

Я не впевнений, як fastcgi впливає на речі. Одна сторінка стверджує, що збірка PHP, що підтримує fastcgi, створить стійкі з'єднання навіть для mysql_connect. Це суперечить документації, оскільки зв’язок закривається, коли закінчується процес, а не сценарій. Замість тестування я рекомендую використовувати mysql_close (). Насправді, я рекомендую використовувати PDO , якщо він доступний.


Я думаю, те саме стосується ftp_close?
doc_id

4
Чи означає це, що якщо користувач закриє сторінку (наприклад) достроково (або є помилка), з’єднання може залишитися відкритим?
Тоні Мішель Кабе

1
@Toni Michel Caubet "The link to the server will be closed as soon as the execution of the script ends."Коли користувач закриває сторінку раніше, це не має значення для сервера PHP. Він запускає скрипт як завжди і кінцевий сценарій як завжди. Тільки користувач не побачить результат.
стрілець

9

Це важливо? Не так багато

Чи вважається це гарною практикою для наслідування? Так.

Я не розумію, чому ви не хотіли б закрити його.


6
Ну, враховуючи, що навіть сторінка керівництва для mysql_closeговорить "Використання mysql_close (), як правило, не потрібна, оскільки непостійні відкриті посилання автоматично закриваються в кінці виконання сценарію." Я б не вважав поганою практикою не переривати зв’язок.
Ніко

4
"Я не розумію, чому ви не хотіли б закрити його". Ви не хотіли б закрити його, якщо є взагалі шанс, що він вам може знадобитися знову.
Frank Farmer

1
якщо U використовує ajax, то якщо з'єднання закрито, то кожен раз, коли U намагається використовувати ajax, з'єднання відкриється і закриється знову, і це буде варте того, ніж залишити з'єднання відкритим для сервера, і клієнту все одно, що з'єднання відкрите, дбайте, щоб веб-сайт був швидким
Роберт,

це справді може мати вирішальне значення !!! якщо навантаження на сервер велике, і у вас багато незамкнених з'єднань, як сказав хтось інший, що це може призвести до неактивного сервера, тому я б назвав це дуже важливим!
oliiix

Краще закрити. Легко і без проблем.
Хосе Карлос PHP

4

Використовуючи щось на зразок cgi, абсолютно непотрібно закривати ваші з'єднання mysql, оскільки вони автоматично закриваються в кінці виконання сценарію. Коли ви використовуєте стійкі технології, такі як mod_perl та інші, які підтримують ваші зв’язки між запитами, важливо відстежувати зв’язки, глобальні змінні тощо.

В основному, для постійних даних приберіть за собою. Щодо тривіальних непостійних даних, це все зникне, коли запит все одно закінчиться. У будь-якому випадку, найкраща практика - це завжди закривати свої зв’язки.


1
Він говорить про PHP, який не є постійним, тому це не застосовується.
Саша Чедигов

2

Закривається, як тільки сценарій завершує виконання. Якщо ви не відкрили постійне з’єднання. В ідеалі ви повинні звільнити ресурс (зв’язок тут), як тільки закінчите з ним. Хіба що існує велика ймовірність того, що вона вам дуже скоро знадобиться під час страти.

Пул з'єднань або використання постійних з'єднань (якщо це те, що ви мали на увазі) - це гарна ідея, якщо ви стоїте за одним сервером баз даних. Однак якщо серверів більше, і ви балансуєте навантаження, це може зашкодити розподілу роботи. Зазвичай деякі клієнти виконують важкі запити, а інші - легші. Отже, якщо одне і те ж підключення використовується протягом n over, деякі сервери можуть зазнати великого навантаження, тоді як інші будуть недостатньо використані. Розгляньте можливість використання менших ttls та змінного розміру пулу з'єднань.


1

Більшість систем управління вмістом закривають з'єднання MySQL в кінці запиту, що насправді безглуздо, оскільки PHP все одно зробить це.

Однак, якщо у вас є сценарій, де зв’язок більше не потрібен, скажіть до середини сценарію, і тоді відбуваються інші важкі дії, тоді непогано закрити зв’язок. Це звільнить деякі ресурси.

Зараз багато говорили про переваги закриття з’єднання, але майже нічого не говорили про переваги його не закриття. По суті, якщо ви не закриєте з'єднання в кінці сценарію, ви дійсно економите деякі ресурси. Уявіть, що веб-програма (або будь-яка інша) отримує 100 переглядів сторінки в секунду. Отже, щосекунди вам потрібно буде викликати mysqli_close100 разів - це означає, що щосекунди у вас буде 100 непотрібних зворотних поїздок на сервер бази даних, щоб закрити відкриті з'єднання. З точки зору продуктивності, це лише накладні витрати, оскільки PHP перевірить наявність відкритих з'єднань, коли скрипт все одно закінчить, і закриє ці з'єднання, і це може бути саме тому, що все відбувається так швидко, що PHP не бачить, що закрив ці зв’язки і спробує закрити їх знову.

Примітка: відповідь вище передбачає, що ви не використовуєте постійні з'єднання (постійні з'єднання не використовуються в жодній з основних систем управління вмістом).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.