#php #mysql
#php #mysql
Вопрос:
У меня проблема со слишком быстрым достижением лимита подключения… Прав ли я, полагая, что следующее поможет решить эту проблему?
Для старых файлов с использованием mysql_query
<?php
mysql_close($link);
if (isset($link2)) {
mysql_close($link2);
}
?>
Для новых файлов с использованием класса mysqli
class DB extends MySQLi {
function __destruct() {
$this->close();
}
}
Комментарии:
1. Зачем вам вообще нужно создавать несколько подключений?:)
2.
Am I right in thinking
— проверьте это на практике, это ваши скрипты.
Ответ №1:
Вы также можете поддерживать соединения открытыми через постоянные соединения (pconnect), в результате чего ваш сервер базы данных объединяет и суммирует соединения. У меня были проблемы с этим примерно до PHP5.2?
Ответ №2:
Соединение закрывается автоматически, когда скрипт завершает свою работу, даже если вы забыли это сделать mysql_close()
. Рассмотрите возможность повышения параметра max_clients my.cnf
Кроме того, если вы используете только одну базу данных, вам не понадобится, вам не нужны два соединения — используйте одно вместо этого.
Комментарии:
1. Я использую две базы данных, хотя это варьируется от скрипта к скрипту. Таким образом, проблема будет заключаться в количестве запросов, а не в соединениях, как вы думаете, тогда?
2. @Джон Смит, да, если у вас много сложных запросов, это означает, что соединение открыто в течение некоторого времени. Меньше запросов означает меньше загруженных соединений.
Ответ №3:
<?php
mysql_close($link);
if (isset($link2)) {
mysql_close($link2);
}
?>
Это не имеет никакого смысла — если известно, что обе переменные могут содержать ресурсы подключения mysql, то закройте обе!
А еще лучше — если ваш код в беспорядке, и вы не можете разобраться в нем, тогда…
<?php
@mysql_close();
@mysql_close();
@mysql_close();
?>
Но единственное место, куда вы можете разумно поместить это (без детального анализа поведения кода — в этом случае вы бы знали, какие ресурсы у вас открыты), находится в конце скрипта — где соединения в любом случае закрываются.
Аналогично, метод destruct вызывается только тогда, когда все ссылки на объект удалены — это немного лучше, но в зависимости от структуры кода вы можете вообще не получить никакой пользы.
Гораздо разумнее определить, на обработку каких URL-адресов уходит много времени, и попытаться повторно разложить код (как PHP, так и SQL) в них.