2009-07-06 2 views
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 файла, который им с помощью для синтаксического анализа, а затем хранить данные в database.Now, когда исходный сайт получает вниз то мои разборе файлов начинает давать ошибку «Warning: mysql_connect(): Слишком много соединений в /home/clickindia/public_html/appuonline/db.php на линии 2 не удалось подключиться:»

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

ответ

1

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

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

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

Рекомендации Артема также уместны.

0
  1. Не display errors для общественности, особенно на производстве.

  2. Использовать exceptions вместо die.

  3. Обращайтесь с вашими ошибками изящно - этот вид идет рука об руку с №1. Не просто умереть - перенаправить на страницу с ошибкой или показать временное сообщение «не удалось сохранить данные».

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

+0

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

1

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

  1. Увеличение max_connections
  2. Reconfigure приложение потреблять меньше

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

0

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

mysql_connect() открывает новые соединения и не закрывает старые. Вы можете использовать mysql_pconnect для решения этой проблемы. Take a look @ this function documentation of mysql pconnect

+0

Использование mysql_pconnect почти наверняка только ухудшит ситуацию, подключившись к соединениям, даже если это им больше не понадобится. – MarkR

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_ * функции. Вы можете узнать больше о шаблоне singleton на wikipedia.

Ваше приложение будет затем работать с классом, как это:

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

Надежда, что помогает!

0

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

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

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

  • Он будет пытаться повторно использовать открытое соединение, которое то же самое.

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

Смежные вопросы