За последние 24 часа нас посетили 16862 программиста и 1312 роботов. Сейчас ищут 1505 программистов ...

MySQL закрывает доступ

Тема в разделе "PHP и базы данных", создана пользователем SPOG, 21 фев 2007.

  1. SPOG

    SPOG Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Россия, 63
    Пишу некий скрипт для обработки данных и внесения их в БД (НЕ СПАМ). Проблема следующая: скрипт оттестирован на отдельном файле - все ок, как только заряжаю цикл с 10 и более файлами MySQL закрывает доступ к БД после 7-8-го файла. Пробовал менять значение в php.ini: mysql.connect_timeout = -1, в самом MySQL в файле my.ini: max_connections=100000 - ничего неизменилось.

    Выводит след. ошибку: "Can't connect to MySQL server on 'localhost' (10048)"

    Сервер стоит на локальной машине, значения max_input_time и max_execution_time выставлены на сутки - проблема точно не в них.

    Поставил: Apache2 + PHP 5.1.4 + MySQL 4.1.16

    Писал подобное на Apach1.3 + PHP 4.x + MySQL 4.x или 5.x - все работало при любом объеме файлов. Думаю проблема в настройках новой версии MySQL.

    Помогите решить проблему кто знает, думаю не у меня одного такая проблема возникла.
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а покажи кам ты коннектишься?
    пойди в цикле?

    =)
     
  3. SPOG

    SPOG Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Россия, 63
    Скрипт на классах, приходится в каждой функции вызывать функцию для коннекта. А в основной функции приходится вызывать соединение прямо внутри цикла - иначе не получается подключиться.

    Вот функция для открытия соединения (вызывается отдельно для каждой функции):
    Код (Text):
    1.  
    2. function Open($thread = '0'){
    3.  
    4.         global $config, $site;
    5.  
    6.         $err = array(0, 0, 0);
    7.  
    8.         $rlink = @mysql_connect($config['db_host'], $config['db_login'], $config['db_password']);
    9.         $select_db = @mysql_select_db($config['db_name'], $rlink);
    10.         @mysql_query("SET NAMES cp1251");
    11.  
    12.         If(!$rlink) $err[1] = 1;
    13.         If($select_db != 1) $err[2] = 1;
    14.         If($err[1] == 1 || $err[2] == 1){
    15.  
    16.             $thread++;
    17.             If($thread >= 5){
    18.  
    19.                 echo "<p align=\"center\">В данный момент сайт перегружен, попробуйте войти через 5 минут. <br>Извиняемся за неудобства, проблема уже решается.</p>";
    20.                 echo "<br><br>error: ".mysql_error()."\n\n";
    21.  
    22.                 ........................
    23.  
    24.                     $site->print_footer();
    25.                 }
    26.                 exit();
    27.  
    28.             } Else {
    29.  
    30.                 $this->Open($thread);
    31.                 return;
    32.  
    33.             }
    34.  
    35.         } Else {
    36.  
    37.             return $rlink;
    38.  
    39.         }
    40.  
    41.     } // end of 'Open()'
     
  4. SPOG

    SPOG Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Россия, 63
    Если что не понятно - спрашивайте, с удовольствием разберу проблему вместе с вами. Может у кого есть мысли по смене настроек в "php.ini" (в PHP) или в "my.ini" (в MySQL)?
     
  5. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    подключение к серверу баз данных, выбор самой базы данных, настройки кодировок нужно вынести из рекурсивного вызова.
    передавайте в функцию дополнительный параметр - ресурс соединения с бд.
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    убери @ при вызовах mysql_*

    или сли используешь - используй правильно

    $id_conn = @mysql_connect() or die('Ошибочка коннекта: '.mysql_error());
    и т.д.

    и хорошим тоном сделать

    mysql_close($id_conn);

    ---

    и уж если делаешь там что-то рекурсивное или какое еще говно, то можно $id_conn впихнуть в static и возвращать уже готовый коннект.


    static $id_conn = false;

    if($id_conn) return $id_conn;
    else //соединение
     
  7. AmiD

    AmiD Активный пользователь

    С нами с:
    16 янв 2007
    Сообщения:
    99
    Симпатии:
    0
    Адрес:
    Томсква
    А чем черевато не делать этого?
    (это не флуд, а любопытство :) )
     
  8. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    1. пореря уважения к самому себе как программисту.
    2. потеря понимания того, что и как, а самое главное _где_ происходит в коде.
    3. выходя из машины ты же не оставляешь двери открытыми, хотя водитель может потом их за тобой закрыть?
    4. хорошо еще делать mysql_free_result()


    можно всего этого не делать. php сделает все за тебя сам по завершению скрипта, но пора, давно пора писать код, а не городить чпуху.
     
  9. SPOG

    SPOG Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    27
    Симпатии:
    0
    Адрес:
    Россия, 63
    Спасибо всем, были проблемы с инетом - "уселся" в настройки MySQL... в общем понял в чем проблема - нехватка ресурсов. Как извесно в MySQL имеется файл настроек 'my.ini' и примеры настроек ("my-small.ini", "my-medium.ini" и т.д.), взял настройки из "my-large.ini", некоторые изменил в большую сторону - заработало. По всей видимости БД не хватало выделенной памяти для вывода значений через "Select" и т.д.

    Заметил еще 1 особенность: через некоторое время БД освобождает ресурсы, в результате если выделенной памяти для скрипта не хватает, можно вставить код для ожидания освобождения ресурсов... Кому интересно, вот что у меня получилось (конечно он далек от идеала):

    PHP:
    1.  
    2. function Open($thread = '0', $sleep = '0'){
    3.    
    4.     global $config, $site;
    5.  
    6.     $err = array(0, 0, 0);
    7.  
    8.     $rlink = mysql_pconnect($config['db_host'], $config['db_login'], $config['db_password']);
    9.     $select_db = mysql_select_db($config['db_name'], $rlink);
    10.     mysql_query("SET NAMES cp1251");
    11.  
    12.     If(!$rlink) $err[1] = 1;
    13.     If($select_db != 1) $err[2] = 1;
    14.     If($err[1] == 1 || $err[2] == 1){
    15.  
    16.         $thread++;
    17.         If($thread >= 5){
    18.  
    19.             echo "<p align=\"center\">В данный           момент сайт перегружен,
    20.             попробуйте войти через 5 минут.
    21.             <br>Извиняемся за неудобства,
    22.             проблема уже решается.</p>";
    23.             echo "<br><br>error: ".mysql_error()."\n\n";
    24.  
    25.             // сам код для ожидания освобождения ресурсов
    26.             If($sleep < 5){
    27.                 exit();
    28.                 $thread = 0;
    29.                 $sleep++;
    30.                 sleep(60); // время в сек. на ожидание
    31.                 $this->Open($thread, $sleep);
    32.             } Else{
    33.                 exit();
    34.             }
    35.  
    36.         } Else {
    37.  
    38.             $this->Open($thread, $sleep);
    39.             return;
    40.  
    41.         }
    42.  
    43.     } Else {
    44.  
    45.         return $rlink;
    46.  
    47.     }
    48.  
    49. } // end of 'Open()'
    50.  
    Былобы не плохо написать функцию по определению времени для освобождения ресурсов, что бы достич автоматизма...

    Все это пробовал - сейчас работает (скорость увеличилась на 8-9%), до изменения настроек в MySQL не работало, поэтому и пробовал все варианты.

    Убрал, для mysql_close(...) есть отдельная функция - использую везде.

    Код (Text):
    1. 4. хорошо еще делать mysql_free_result()
    mysql_free_result(...) - вошла в привычку, при обработке больших объемов информации очень помогает, всем советую.

    Проблема решена, всем спасибо - тема закрыта.