Должен ли я $ mysqli-> закрывать соединение после каждой загрузки страницы, если PHP работает через FCGI?

Я запускаю PHP через FCGI — то есть мой веб-сервер порождает несколько процессов PHP, и они продолжают выполнять около 10 000 запросов, пока не будут переработаны.

Мой вопрос — если я $mysqli->connect в верхней части моего сценария PHP, мне нужно позвонить $mysqli->close когда я собираюсь закончить выполнение сценария?

Поскольку процессы PHP открыты в течение длительного времени, я представляю каждый $mysqli->connect будет утечка 1 соединения, потому что процесс продолжает работать, и никто не закрывает соединение.

Я прав в своих мыслях или нет? Я должен звонить $mysqli->close?

6

Решение

Когда PHP выходит, он корректно закрывает соединения с базой данных.

Единственная причина использовать метод close — это когда вы хотите разорвать соединение с базой данных, которое вы больше не будете использовать, и у вас много дел: например, обработка и потоковая передача данных, но если это быстро, вы можете забыть о закрытии заявления.

Помещение его в конец скрипта означает избыточность, отсутствие производительности или увеличения памяти.

7

Другие решения

Более подробно, особенно о FastCGI:

FastCGI поддерживает обработку PHP между запросами. FastCGI хорош в сокращении использования процессора, используя доступную оперативную память вашего сервера для хранения PHP-скриптов в памяти, вместо того, чтобы запускать отдельный процесс PHP для каждого запроса PHP.

3

FastCGI запустит мастер-процесс и столько веток этого мастер-процесса, сколько вы определили, и да, эти разветвленные процессы могут существовать в течение длительного времени. Фактически это означает, что процессу не нужно запускать полный процесс PHP каждый раз, когда ему нужно выполнить скрипт. Но не похоже, что вы думаете, что ваши скрипты теперь работают все время. Все еще есть фаза запуска и останова каждый раз, когда должен быть выполнен скрипт. На данный момент такие вещи, как глобальные переменные (например, $_POST а также $_GET) заполнены и т. д. Вы можете выполнять функции каждый раз, когда ваш процесс останавливается с помощью register_shutdown_function(),

Если вы не используете постоянные соединения с базой данных и не закрываете соединения с базой данных, ничего плохого не произойдет. Как объяснил Колин Шон, PHP в конечном итоге закроет их во время выключения.

Тем не менее, я высоко Рекомендуем вам закрыть ваши соединения, потому что правильно созданная программа знает, когда истекает срок жизни объекта, и очищает себя. Это может дать вам именно миллисекунду или наносекунду, что вам нужно, чтобы доставить что-то вовремя.

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

3

Я никогда не доверял FCGI, чтобы закрыть мои подключения к базе данных для меня. Одна привычка, которую я выучил в книге для начинающих много лет назад, — это всегда явно закрывать соединения с базой данных.

Не стоит ли печатать шестнадцать нажатий клавиш за возможную утечку памяти и соединения? Насколько я понимаю, это дешевая страховка.

2

Если вы долго выполняете процессы FastCGI, например, через php-fpm, вы можете повысить производительность, повторно используя соединение с базой данных внутри каждого процесса и избегая затрат на его открытие.

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

http://php.net/manual/en/mysqli.quickstart.connections.php

http://php.net/manual/en/mysqli.persistconns.php

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

2

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

Вы также можете уменьшить количество повторных циклов в каждом цикле, чтобы остановить соединение.

Например: каждый скрипт 2500 запускается, останавливается, закрывается и снова открывается соединение.

Также рекомендуется: часто делать резервные копии данных.

Надеюсь, я помог. фантом

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector