powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PDO не разрывает соединение с MySQL
16 сообщений из 16, страница 1 из 1
PDO не разрывает соединение с MySQL
    #39449684
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Операционная система Windows 7, сервер Apache/2.2.22 (Win32) PHP/5.4.40, MySQL 5.6.26.
Для подключения к базе данных использую строку:
Код: php
1.
2.
$strDSN = 'mysql:host:localhost;post:3306;dbname:testdb;';
$objDB = new PDO($strDSN, 'user', 'pass');


Нормально работает, принимает-отправляет запросы к MySQL.
Но при перезагрузке страницы в браузере подключение остается постоянным(. Я это заметил, когда решил поменять параметры подключения к базе данных в $strDNS.
Перепробовал все рекомендации из интернет:
1. При завершении скрипта страницы обнулил $objDB = null и все объекты, которые участвовали в запросах PDO.
2. Даже попробовал прописать опцию, отменяющую постоянное соединение (хотя она и так по-умолчанию отключена):
Код: php
1.
$objDB = new PDO($strDSN, 'user', 'pass', array(PDO::ATTR_PERSISTENT=>false));


Что ещё можно сделать для разрыва соединения?
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449687
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы уверены в том что информация берется не из того или иного кеша? (браузера, сервера, ваших скриптов...), а из скрипта/базы?
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449696
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sxq,

1. Файл PHP не кэшируется - проверил вставкой сообщений echo() или exit().
2. Файл JS, который вызывает PHP не кэшируется, проверил так же вставкой alert().
3. В базе MySQL нет никаких активных соединений в промежутках между перезапусками страницы в браузере.
4. В диспетчере задач Windows не видно каких-то много раз повторяющихся процессов, правда httpd почему-то 2 раза запущен, хотя сервер установлен один, но это вряд ли относится к делу.
5. Кэшируется каким-то образом соединение PDO, но как его отключить - не знаю. Можно было бы попытаться разорвать соединение перед открытием нового соединения, но я не знаю его ID, хотя можно попробовать ID сохранить в сессию и разорвать или проверить, что оно активно (не вижу пользы от постоянного соединения, все каждый раз надо проверять активно оно или нет).
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449729
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень смущает пункт 2
вам нужно на 100% знать что запросы из JS не кешируются
Проверить легко, в скрипт PHP который вы вызываете вставьте дополнительный вывод, так же все это легко проверить и в отладчике браузера, какие запросы идут, и что возвращается.
Между запросами просто остановите базу данных, для чистоты эксперимента.
Чудес не бывает, после отработки PHP, все что было связано с текущим состоянием уничтожается.
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449732
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sxq,
п.2. конечно же проверял выводом на экран того, что возвращает PHP.
Нашел похожую тему аж 2008 года, но там решение не найдено: https://phpclub.ru/talk/threads/pdo-attr_persistent-всегда-true.54518/
Странно, такое чувство что PDO никто не пользуется... мало информации по этой ситуации.
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449736
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привожу исходный код функции подключения к базе. Может быть я делаю что-то не так в самой обработке ошибок подключения? Это просто первый опыт, раньше с PDO не работал. Обратите внимание, я в коде специально сделал "кривыми" адрес хоста и номер порта, но скрипт отрабатывает без ошибок, используя первоначальные настройки подключения, как буд-то соединение и не разрывалось.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
<?php

// ФАЙЛ PHP: функции для работы с базой данных MySQL

// ФУНКЦИЯ: подключение к базе данных
//	$masParam - параметры подключения к базе данных:
//		$masParam['Host'], $masParam['Login'], $masParam['Pass'], $masParam['Database'], $masParam['Port']
// Возвращает объект базы данных или false в случае ошибки
function database_connect($masParam) {
	// формирование строки DNS
	$strDSN = 'mysql:';
	$strDSN.= 'host:12'.$masParam['Host'].';';
	$strDSN.= 'port:2'.$masParam['Port'].';';
	$strDSN.= 'dbname:'.$masParam['Database'].';';
	// установка опций подключения
	$masOptions = array (
		PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,		// режим обратки ошибок
		PDO::ATTR_DEFAULT_FETCH_MODE =>	PDO::FETCH_ASSOC	// получение именованного массива при запросе
	);
	// подключение к базе данных
	try {
		// подключение
		$objDB = new PDO($strDSN, decode_key($masParam['User']), decode_key($masParam['Pass']), $masOptions);
		exit('Connect OK:'.$strDSN);
		// формирование запроса для инициализации параметров
		$strSQL = 'SET character_set_server="utf8";';
		$strSQL.= 'SET character_set_client="utf8";';
		$strSQL.= 'SET character_set_connection="utf8";';
		$strSQL.= 'SET character_set_results="utf8";';
		$strSQL.= 'SET NAMES utf8 COLLATE utf8_unicode_ci;';
		$strSQL.= 'SET collation_connection="utf8_general_ci";';
		try {
			$varRes = $objDB->query($strSQL);
			print_r($varRes);
			$varRes = null;
			$objDB = null;			
			exit();			
		} catch (Exception $objError) {
			print_r($objError);
			$varRes = null;
			$objDB = null;
			exit();
		}
		// инициализация параметров базы данных и выход в случае ошибки
		if (!($objRes = $objDB->query($strSQL))) return false;		
		// сохранение результата
		return $objDB;		
	} catch (Exception $objError) {
		print_r($objError);
		exit();		
		// сохранение результата
		return false;
	}
}

?>
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449740
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Смирнов,

Вообще-то, соединение разрывается, когда загружены данные на страницу. Ну, так оно работает под вэб. Просто, нифига не понял в чём проблема.
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449741
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeАлексей Смирнов,

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

Проблема в том, что я хотел посмотреть - какие ошибки возникают, если я умышленно порчу какие-то параметры подключения (см. исходный код). Но что бы я не портил, при последующих перезапусках страницы в браузере через F5 или CTRL+F5 подключение не "портится", оно отрабатывает последующие запросы так, как буд-то я строку $strDNS не испортил, т.е. ошибки выполнения не происходит, а если я делаю запросы к базе данных, то они РАБОТАЮТ! как ни в чем не бывало.
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449742
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Смирнов,

В диспетчере задач Windows 7 висит два процесса httpd, пробовал убивать вручную. Но при повторном запуске Apache оба процесса восстанавливают как были. Подозреваю, что второй процесс httpd и держит это самое PDO, потому что если я его убиваю в диспетчере задач, не убив первый, то второй тут же самовосстанавливается (его первый похоже сам восстанавливает).
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449745
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей СмирновПодозреваю, что второй процесс httpd и держит это самое PDO, потому что если я его убиваю в диспетчере задач, не убив первый, то второй тут же самовосстанавливается (его первый похоже сам восстанавливает).Неправильно подозреваете. PDO - это пхпшная штуковина. А что процессов у Апача более одного - ну так он работает.

Примерчик из htop
[fix ]
1438 root 20 0 64504 5660 4388 S 0.0 0.0 0:00.55 ├─ /usr/sbin/httpd2 -k start
1442 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:02.60 │ ├─ /usr/sbin/httpd2 -k start
1496 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.08 │ │ ├─ /usr/sbin/httpd2 -k start
1495 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1493 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1491 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1489 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1487 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1485 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1483 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.08 │ │ ├─ /usr/sbin/httpd2 -k start
1481 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1479 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.10 │ │ ├─ /usr/sbin/httpd2 -k start
1477 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1475 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1473 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1471 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1469 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.10 │ │ ├─ /usr/sbin/httpd2 -k start
1467 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1465 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1463 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1461 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.10 │ │ ├─ /usr/sbin/httpd2 -k start
1459 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1457 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.13 │ │ ├─ /usr/sbin/httpd2 -k start
1454 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1452 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1450 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1448 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1446 apache2 20 0 1945M 11840 3232 S 0.0 0.1 0:00.09 │ │ └─ /usr/sbin/httpd2 -k start
1441 apache2 20 0 1945M 10424 3200 S 0.0 0.1 0:02.50 │ ├─ /usr/sbin/httpd2 -k start
1494 apache2 20 0 1945M 10424 3200 S 0.0 0.1 0:00.08 │ │ ├─ /usr/sbin/httpd2 -k start
1492 apache2 20 0 1945M 10424 3200 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1490 apache2 20 0 1945M 10424 3200 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1488 apache2 20 0 1945M 10424 3200 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1486 apache2 20 0 1945M 10424 3200 S 0.0 0.1 0:00.09 │ │ ├─ /usr/sbin/httpd2 -k start
1484 apache2 20 0 1945M 10424 3200 S 0.0 0.1 0:00.08 │ │ ├─ /usr/sbin/httpd2 -k start


[/fix]
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449747
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

ладно, чуть позже поэкспериментирую без Ajax на чистом PHP.
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449759
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а почему вы думаете, что должно быть по другому?
Programming PHP, Kevin Tatroe, Peter MacIntyre, and Rasmus LerdorfA function is a named block of code that performs a specific task, possibly acting upon
a set of values given to it, or parameters, and possibly returning a single value. Functions
save on compile time—no matter how many times you call them, functions are compiled
only once for the page.
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449782
sxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую исключительно PDO, правда только на *NIX системах, никогда даже намека на такое не было. Сам PHP будь то PDO или Mysqli - используют одни и те же библиотеки для взаимодействия с внешними средами.
Вы не сказали что происходит если между обновлениями страниц просто остановить MySql, будет ошибка или нет.
Способ обмена напрямую или через ajax сути не меняет, и там и там стандартные GET/POST запросы, и если запросы не кешируются браузером, то проблема либо в библиотеке-посреднике через который работает PHP с мускулом, либо в самом мускуле. PHP отработал и все умирает в памяти, если конечно у вас при после многочисленных запросах не плодится куча процессов или не утекает память в процессе.
На мой взгляд PHP + Windows - не очень хорошее решение.
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39449795
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
imho, там не с PDO проблема и даже не с самой функцией database_connect.
из того, что тс рассказал, похоже, что просто не перегружается функция, вызывающая database_connect.
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39450522
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sxqИспользую исключительно PDO, правда только на *NIX системах, никогда даже намека на такое не было. Сам PHP будь то PDO или Mysqli - используют одни и те же библиотеки для взаимодействия с внешними средами.
Вы не сказали что происходит если между обновлениями страниц просто остановить MySql, будет ошибка или нет.
Способ обмена напрямую или через ajax сути не меняет, и там и там стандартные GET/POST запросы, и если запросы не кешируются браузером, то проблема либо в библиотеке-посреднике через который работает PHP с мускулом, либо в самом мускуле. PHP отработал и все умирает в памяти, если конечно у вас при после многочисленных запросах не плодится куча процессов или не утекает память в процессе.
На мой взгляд PHP + Windows - не очень хорошее решение.

Я хотел универсальное решение, чтобы под Windows тоже работало. Во всяком случае библиотека mysql работает отлично. А вот mysqli мне запустить не удалось, поэтому стал смотреть в сторону PDO.

Если остановить mysql на локальном компьютере, то выскакивает ошибка:
Код: php
1.
SQLSTATE[HY000] [2002] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение



Точно такая же ошибка появляется, когда я строке DSN менял адрес сервера при остановленном mysql на локальном компьютере (у меня на другом компе тоже mysql есть, доступный по сети и это гарантировано, т.к. на нем действующий проект работает):
Код: php
1.
mysql:host:192.168.74.1;port:3306;dbname:test;


Ошибка выскакивает:
Код: php
1.
SQLSTATE[HY000] [2002] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение


(не реагирует на изменение строки DSN).

Но что интересно, если я в функции меняю логин или пароль:
Код: php
1.
$objDB = new PDO($strDSN, $masParam['User'], $masParam['Pass'], $masOptions);


то выскакивает ошибка mysql:
Код: php
1.
SQLSTATE[HY000] [1045] Access denied for user 'root1'@'localhost' (using password: YES)



Странно, что PDO не реагирует на изменения в строке DSN имени хоста, номера порта, базы данных. Т.е. как первый раз законнектился, все - не реагирует ни на какие изменения при следующем перезапуске страницы браузера.

Всё же сделал отдельный файл index.php для чистоты эксперимента. Результат тот же.

Ещё попробовал поменять адрес страницы с index.php на index1.php, ничего не изменилось. На строку DSN не реагирует.

На мой взгляд PHP + Windows - не очень хорошее решение.

Возможно сделаю на Nix со временем, но нужно, чтобы под Windows тоже работало. Библиотека mysql работает и ничего. Если с PDO такие заморочки, а mysqli библиотека вообще не подключилась, хотя я все рекомендации выполнил, то мне проще на старой библиотеке mysql остаться.
...
Рейтинг: 0 / 0
PDO не разрывает соединение с MySQL
    #39450525
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleАлексей СмирновПодозреваю, что второй процесс httpd и держит это самое PDO, потому что если я его убиваю в диспетчере задач, не убив первый, то второй тут же самовосстанавливается (его первый похоже сам восстанавливает).Неправильно подозреваете. PDO - это пхпшная штуковина. А что процессов у Апача более одного - ну так он работает.
[/fix][/spoiler]

Ну хорошо).
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PDO не разрывает соединение с MySQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]