MySQL соединение

0

Im, используя этот код для соединения mysql

$con = mysql_connect("localhost:/var/lib/mysql/mysql.sock", "abc" , "xyz");
if (!$con)
{
    die('Could not connect: ');
}
mysql_select_db("database_name", $con);

Im, включающий этот файл в верхней части каждого php файла, который им используется для синтаксического анализа, а затем для хранения данных в базе данных. Теперь, когда исходный сайт падает, мои файлы разбора начинают давать ошибку Msgstr "Предупреждение: mysql_connect(): Слишком много соединений в /home/clickindia/public _html/appuonline/db.php в строке 2 Не удалось подключиться: "

Что мне делать, чтобы сохранить мой сайт из этих ошибок. Вы думаете, что я должен использовать mysql_close ($ con); Но как и где??? Я использую штамп в моем коде, это правильно или я должен использовать закрытие и т.д. Помощь plz.

Теги:
database-connection

6 ответов

1
Лучший ответ

Вы говорите, что вы установили этот код подключения "вверху каждого php файла".

Мой вопрос: используете ли вы несколько этих файлов для одной страницы?

Если это так, вы должны открыть соединение только один раз для страницы. Это может быть объяснением ошибки.

Артемы советуют также.

1

Возможно, вам стоит рассмотреть возможность обертывания одного элемента вокруг доступа к базе данных. Преимущества:

  • Вы можете использовать только одно соединение.
  • Вы только открываете соединение, если вам это нужно (а не произвольно подключаться на каждой странице).

Вы можете свернуть свой собственный синглтон или получить один из фреймворка, подумав, что это может быть чрезмерным в зависимости от того, над чем вы работаете. Основы будут примерно такими:

class DatabaseAccess {
     private static $instance;
     private $connection;

     //declare the constructor private so we can only use it in this class
     private function __construct( $host, $user, $pass, $db ) {
         $this->connection = mysql_connect( $host, $user, $pass );
         mysql_select_db( $db, $this->connection );
     }

     //provide access to a single instance
     public static function instance() {
         if ( ! isset( self::$instance ) ) {
             self::$instance = new DatabaseAccess('host', 'user', 'pass', 'db');
         }
         return self::$instance;
     }

     //functions to execute/query the db
     public function query( $query ) {
         return mysql_query( $query, $this->connection );
     }

}

Если бы я пошел по этому маршруту, я бы, вероятно, сделал это, контролируя доступ к экземпляру mysqli и использую его напрямую, а не обертывая функции mysql_ *. Вы можете узнать больше об одноэлементном шаблоне в википедии.

Затем ваше приложение будет работать с классом следующим образом:

$dba = DatabaseAccess::instance();
$result = $dba->query('select * from pages');
mysql_fetch_assoc($result);
//blah blah blah

Надеюсь, что это поможет!

1

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

  • Увеличить max_connections
  • Переконфигурируйте приложение, чтобы потреблять меньше

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

0

Вы также можете использовать mysql_pconnect:

Устанавливает постоянное соединение с сервером MySQL.

mysql_pconnect() очень похож на mysql_connect() с двумя основными отличиями.

  • Он попытается повторно использовать открытый это одно и то же.

  • Он не будет закрывать соединение в конец script.

0

mysql имеет ограничение на количество подключений, которые он может предоставить клиенту (в этом случае клиентская библиотека php).

mysql_connect() открывает новые соединения и не закрывает старые. Вы можете использовать mysql_pconnect для решения этой проблемы. Посмотрите @эту функциональную документацию mysql pconnect

  • 0
    Использование mysql_pconnect почти наверняка только усугубит ситуацию, если будет поддерживать соединения, даже когда они больше не нужны.
0
  • Не показывать ошибки для публики, особенно при производстве.

  • Используйте exceptions вместо die.

  • Обработайте свои неудачи грациозно - этот вид идет рука об руку С# 1. Не просто умереть - перенаправить на страницу с ошибкой или показать временное сообщение "не удалось сохранить данные".

  • Настройте ведомости MySQL и запросите их, если сможете. Репликация всегда поможет вам со стабильностью и единственными точками отказа (в определенной степени).

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню