Пишу некий скрипт для обработки данных и внесения их в БД (НЕ СПАМ). Проблема следующая: скрипт оттестирован на отдельном файле - все ок, как только заряжаю цикл с 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. Помогите решить проблему кто знает, думаю не у меня одного такая проблема возникла.
Скрипт на классах, приходится в каждой функции вызывать функцию для коннекта. А в основной функции приходится вызывать соединение прямо внутри цикла - иначе не получается подключиться. Вот функция для открытия соединения (вызывается отдельно для каждой функции): Код (Text): function Open($thread = '0'){ global $config, $site; $err = array(0, 0, 0); $rlink = @mysql_connect($config['db_host'], $config['db_login'], $config['db_password']); $select_db = @mysql_select_db($config['db_name'], $rlink); @mysql_query("SET NAMES cp1251"); If(!$rlink) $err[1] = 1; If($select_db != 1) $err[2] = 1; If($err[1] == 1 || $err[2] == 1){ $thread++; If($thread >= 5){ echo "<p align=\"center\">В данный момент сайт перегружен, попробуйте войти через 5 минут. <br>Извиняемся за неудобства, проблема уже решается.</p>"; echo "<br><br>error: ".mysql_error()."\n\n"; ........................ $site->print_footer(); } exit(); } Else { $this->Open($thread); return; } } Else { return $rlink; } } // end of 'Open()'
Если что не понятно - спрашивайте, с удовольствием разберу проблему вместе с вами. Может у кого есть мысли по смене настроек в "php.ini" (в PHP) или в "my.ini" (в MySQL)?
подключение к серверу баз данных, выбор самой базы данных, настройки кодировок нужно вынести из рекурсивного вызова. передавайте в функцию дополнительный параметр - ресурс соединения с бд.
убери @ при вызовах 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 //соединение
1. пореря уважения к самому себе как программисту. 2. потеря понимания того, что и как, а самое главное _где_ происходит в коде. 3. выходя из машины ты же не оставляешь двери открытыми, хотя водитель может потом их за тобой закрыть? 4. хорошо еще делать mysql_free_result() можно всего этого не делать. php сделает все за тебя сам по завершению скрипта, но пора, давно пора писать код, а не городить чпуху.
Спасибо всем, были проблемы с инетом - "уселся" в настройки MySQL... в общем понял в чем проблема - нехватка ресурсов. Как извесно в MySQL имеется файл настроек 'my.ini' и примеры настроек ("my-small.ini", "my-medium.ini" и т.д.), взял настройки из "my-large.ini", некоторые изменил в большую сторону - заработало. По всей видимости БД не хватало выделенной памяти для вывода значений через "Select" и т.д. Заметил еще 1 особенность: через некоторое время БД освобождает ресурсы, в результате если выделенной памяти для скрипта не хватает, можно вставить код для ожидания освобождения ресурсов... Кому интересно, вот что у меня получилось (конечно он далек от идеала): PHP: function Open($thread = '0', $sleep = '0'){ global $config, $site; $err = array(0, 0, 0); $rlink = mysql_pconnect($config['db_host'], $config['db_login'], $config['db_password']); $select_db = mysql_select_db($config['db_name'], $rlink); mysql_query("SET NAMES cp1251"); If(!$rlink) $err[1] = 1; If($select_db != 1) $err[2] = 1; If($err[1] == 1 || $err[2] == 1){ $thread++; If($thread >= 5){ echo "<p align=\"center\">В данный момент сайт перегружен, попробуйте войти через 5 минут. <br>Извиняемся за неудобства, проблема уже решается.</p>"; echo "<br><br>error: ".mysql_error()."\n\n"; // сам код для ожидания освобождения ресурсов If($sleep < 5){ exit(); $thread = 0; $sleep++; sleep(60); // время в сек. на ожидание $this->Open($thread, $sleep); } Else{ exit(); } } Else { $this->Open($thread, $sleep); return; } } Else { return $rlink; } } // end of 'Open()' Былобы не плохо написать функцию по определению времени для освобождения ресурсов, что бы достич автоматизма... Все это пробовал - сейчас работает (скорость увеличилась на 8-9%), до изменения настроек в MySQL не работало, поэтому и пробовал все варианты. Убрал, для mysql_close(...) есть отдельная функция - использую везде. Код (Text): 4. хорошо еще делать mysql_free_result() mysql_free_result(...) - вошла в привычку, при обработке больших объемов информации очень помогает, всем советую. Проблема решена, всем спасибо - тема закрыта.