Ограничение соединения MySQL

#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) в них.