Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PDO не разрывает соединение с MySQL / 16 сообщений из 16, страница 1 из 1
06.05.2017, 08:06
    #39449684
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PDO не разрывает соединение с MySQL
Добрый день!
Операционная система 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
06.05.2017, 08:46
    #39449687
sxq
sxq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PDO не разрывает соединение с MySQL
вы уверены в том что информация берется не из того или иного кеша? (браузера, сервера, ваших скриптов...), а из скрипта/базы?
...
Рейтинг: 0 / 0
06.05.2017, 09:42
    #39449696
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PDO не разрывает соединение с MySQL
sxq,

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

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

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

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

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

ладно, чуть позже поэкспериментирую без Ajax на чистом PHP.
...
Рейтинг: 0 / 0
06.05.2017, 15:03
    #39449759
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PDO не разрывает соединение с MySQL
а почему вы думаете, что должно быть по другому?
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
06.05.2017, 18:36
    #39449782
sxq
sxq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PDO не разрывает соединение с MySQL
Использую исключительно PDO, правда только на *NIX системах, никогда даже намека на такое не было. Сам PHP будь то PDO или Mysqli - используют одни и те же библиотеки для взаимодействия с внешними средами.
Вы не сказали что происходит если между обновлениями страниц просто остановить MySql, будет ошибка или нет.
Способ обмена напрямую или через ajax сути не меняет, и там и там стандартные GET/POST запросы, и если запросы не кешируются браузером, то проблема либо в библиотеке-посреднике через который работает PHP с мускулом, либо в самом мускуле. PHP отработал и все умирает в памяти, если конечно у вас при после многочисленных запросах не плодится куча процессов или не утекает память в процессе.
На мой взгляд PHP + Windows - не очень хорошее решение.
...
Рейтинг: 0 / 0
06.05.2017, 20:43
    #39449795
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PDO не разрывает соединение с MySQL
imho, там не с PDO проблема и даже не с самой функцией database_connect.
из того, что тс рассказал, похоже, что просто не перегружается функция, вызывающая database_connect.
...
Рейтинг: 0 / 0
10.05.2017, 06:56
    #39450522
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PDO не разрывает соединение с MySQL
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
10.05.2017, 07:18
    #39450525
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PDO не разрывает соединение с MySQL
vkleАлексей СмирновПодозреваю, что второй процесс httpd и держит это самое PDO, потому что если я его убиваю в диспетчере задач, не убив первый, то второй тут же самовосстанавливается (его первый похоже сам восстанавливает).Неправильно подозреваете. PDO - это пхпшная штуковина. А что процессов у Апача более одного - ну так он работает.
[/fix][/spoiler]

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


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