Когда открывать/ закрывать соединение

myau

Новичок
Когда открывать/ закрывать соединение

Расскажите, пожалуйста, в какой момент выполнения скрипта вы создаете соединение к базе?
В одной книжке по PHP+MySQL был пример с функцией, где была создана функция для соединения, которая вызывалась всякий раз перед выполнением запроса. Почитав результаты поиска, вижу, что некоторые открывают соединение в начале скрипта и закрывают или не закрывают в конце. Но есть ли на самом деле разница, если в описании функции mysql_connect написано, что если функция вызывается с одними и теми же параметрами, то новое соединение не будет открыто, а будет использовано старое..

Просто у меня возникла проблема при выполнении скрипта на хостинге - в какой-то момент появилось сообщение Too many connections. Вот и думаю, с чем это связано? Получается, может быть открыто несколько соединений только если несколько человек с разных компов запустили скрипт?
Извините, если глупые вопросы. Просто опыта маловато..
 

myau

Новичок
А можно послушать аргументы?

http://ru.php.net/manual/ru/function.mysql-connect.php:
Если второй вызов функции произошёл с теми же аргументами mysql_connect(), новое соединение не будет установлено. Вместо этого функция вернёт ссылку на уже установленное соединение.
Я что-то неправильно понимаю?
 

Фанат

oncle terrible
Команда форума
vasa_c
в мане написано то же самое. его тоже выкинуть?

myau
ты уверен, что Too many connections вызывается именно множественными коннектами в скрипте?

в любом случае, коннектиться сто раз во время работы скрипта не нужно.
это надо делать ОДИН раз
 

vasa_c

Новичок
Правильно. При повторном вызове новое соединение не устанавливается, а возвращается ссылка на существующее.
Так какой смысл вызывать второй раз?

-~{}~ 13.06.06 18:01:

Фанат
>в любом случае, коннектиться сто раз во время работы скрипта не нужно. это надо делать ОДИН раз

Так а я не тоже самое сказал?

>в мане написано то же самое. его тоже выкинуть?

В мане нет описания функций, которые коннектятся перед каждым запросом.
Или может я не заметил. Просто какой смысл?
 

myau

Новичок
ты уверен, что Too many connections вызывается именно множественными коннектами в скрипте?
Фанат, нет. Вот и пытаюсь понять, чем вызывается. Как это можно узнать?
Если повторное соединение не устанавливается, то кто его установил? Другой юзер на другой машине, обратившийся к скрипту? Или там тоже будет то же самое соединение?

Что касается коннекта - т.е. ты коннектишься в начале каждого скрипта, а потом в конце закрываешь?
 

Фанат

oncle terrible
Команда форума
Или там тоже будет то же самое соединение?
нет, разное
Что касается коннекта - т.е. ты коннектишься в начале каждого скрипта, а потом в конце закрываешь?
а что - неясно написал?

-~{}~ 13.06.06 18:23:

Как это можно узнать?
выяснить, не использвешь ли ты pconnect
узнать, какая нагрузка и какое среднее время выполнения скрипта.
посмотреть логи базы
 

myau

Новичок
Пробую открывать только в начале скрипта, точнее, сначала открывается сессия, потом инклудится скрипт с функциями, а потом вызывается функция коннекта к базе.

PHP:
$connect = mysql_connect(server_name,db_user,db_password)
   or die("Ошибка соединения с MySQL: ".mysql_error());

 mysql_select_db(db_name)
   or die ("Ошибка при открытии базы данных: ".mysql_error());
В начале все нормально коннектится, но при вызове запросов возникает ошибка Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Если сделать коннект к базе сразу перед запросом, то все нормально коннектится. В чем может быть дело? Может это быть от того, что функция, выполняющая запрос, находится в другом скрипте? Но ведь он инклудится до коннекта к базе.. Ничего не понимаю (с)

(использую только mysql_connect)
 

Фанат

oncle terrible
Команда форума
ничего не понимаешь - так разбирайся. программист ты, или кто?
идентификатор соединения в запросе указываешь?
 

myau

Новичок
Фанат, спасибо за правильные вопросы.

Не всегда понятно, где копать. На локалхосте все работает с открытием в начале скрипта - проблемы возникли на хостинге.

Идентификатор не указываю. и раньше тоже. Но ведь если он не указан, используется последнее соединение?

"mysql_query() посылает запрос активной базе данных сервера, на который ссылается переданный указатель. Если параметр link_identifier опущен, используется последнее открытое соединение. Если открытые соединения отсутствуют, функция пытается соединиться с СУБД, аналогично функции mysql_connect() без параметров. "
Я не понимаю, почему функция пытается кооннектиться без параметров, если в начале скрипта было совершено соединение? И почему все работает, если передавать идентификатор?
 

Фанат

oncle terrible
Команда форума
это вопрос не к нам
это вопрос к твоему скрипту.
он у тебя так написан, что соединение не видно.
при этом я даже не представляю, Как так можно написать.
в любом случае, раз скрипт твой, то тебе его и отлаживать.
если ты знаешь, что это такое.
если не знаешь - я тебе объясню

-~{}~ 14.06.06 17:06:

у меня уже такое подозрение закразывается, что ты инклюдишь скрипты по Http://
это смешно, но зато объясняет и кучу коннектов, и что переменная не видна...
 

myau

Новичок
Автор оригинала: Фанат
при этом я даже не представляю, Как так можно написать.
:D

у меня уже такое подозрение закразывается, что ты инклюдишь скрипты по Http://
это смешно, но зато объясняет и кучу коннектов, и что переменная не видна...
что значит инклюдишь по http?
Например, скрипт авторизации выглядел вот так:

PHP:
<?
session_start();

require_once("func.php");

$conn = db_connect();

if ( isset($_POST['login']) && isset($_POST['password']))
{
	
	$login = remove_bad_symbols($_POST['login']);
	$password = remove_bad_symbols($_POST['password']);
	
	$userID = check_user($login, $password);
	if ( $userID ) 
	{
		$_SESSION['auth'] = $userID;
		exit(header("Location: index.php"));
	}
	else 
	{
 		include ('top.php');
		?>
		<p>Вы ввели неверный логин и пароль. Попробуйте еще раз</p>
		<?
		<<<Тут форма>>>
		include('bottom.php');

	}	
}
else
{
<<<Тут тоже форма>>>
}
?>
Функция check_user находится в func.php, и ошибка возникала именно в ней. Что тут не так?
Если передавать идентификатор соединения, то работает..
 

Фанат

oncle terrible
Команда форума
это вопрос не к нам
это вопрос к твоему скрипту.
он у тебя так написан, что соединение не видно.
при этом я даже не представляю, Как так можно написать.
в любом случае, раз скрипт твой, то тебе его и отлаживать.
если ты знаешь, что это такое.
если не знаешь - я тебе объясню
 

serglt

Анус, ой, Ахтунг
Просто в начале функции добавь строчку
global $conn;
А то у тебя она не определена в функции по ентому может быть у тебя и проблеммы. Почитай про уровни доступа к переменным
 

Фанат

oncle terrible
Команда форума
ну, если всё происходит не так, как он рассказывает, а строго наоборот, то это ему поможет.
 

dimich

Новичок
Вообще всё как-то не по людски в этом скрипте ). Зачем каждый раз использовать эту байду:
$conn = db_connect();

Покажу как у меня работает алгоритм подключения.

Некий главный файл(кусок кода с подключением и стартом сессий):
PHP:
<?  # открываем сессию
      session_start();

	 # Именно здесь лежить коннект к муслукю MySQL
          require("cnf/connect.mysql"); 
?>
А вот и собственно сам connect.mysql:

PHP:
<?

$sqlserver        = "localhost";    # Сервер баз данных
$sqluser           = "root";      # Пользователь
$sqlpassword  = "123";    # Пароль
$sqldb             = "mydb";        # Название БД

$dbconnect = mysql_connect($sqlserver, $sqluser, $sqlpassword); // Подключаемся единожды и навсегда

if ( ! $dbconnect ):
        print "<b><font color=red>Невозможно установить подключение</font></b>";
        return false;
endif;
if ( ! mysql_select_db($sqldb, $dbconnect) ):
        $dberror = mysql_error();
        return $dberror;
endif;

      mysql_query("SET NAMES utf8"); /* Если надо, то всю исходящую из БД информацию перекодировываем в utf-8. Доступно только с версии MySQL 4.1 */
?>
-~{}~ 20.06.06 10:51:

Потом просто вызываем $dbconnect. Например при обновлении информации: mysql_query($update, $dbconnect);
 

myau

Новичок
serglt
Спасибо, так работает..

Фанат
ну, если всё происходит не так, как он рассказывает, а строго наоборот, то это ему поможет.
Почему? Коннект в начале скрипта, запросы в функциях - почему строго наоборот?

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

Фанат

oncle terrible
Команда форума
сначала ты пишешь:
Идентификатор не указываю.
теперь вещаешь:
переменная, которая каким-то образом передается в запросы..
то есть, переменную передаёшь, но никак не используешь, что ли?
это, собственно, и ответ на твой вопрос,
почему строго наоборот?
 
Сверху